2012-05-07 30 views
25

Mã như:Trong Java, các lớp ẩn danh có thể mở rộng một lớp khác không?

protected Interface1 varClass1 = new Interface1() { 

Nhưng tôi cũng muốn rằng lớp lồng nhau ẩn danh này cũng mở rộng các lớp Base, một cái gì đó như:

protected Interface1 varClass1 = new Interface1() extends Base { 
.... 

Đây có phải là có thể trong Java?

+1

@EranMedan - Câu hỏi này đặc biệt là làm cả hai cùng một lúc: mở rộng một lớp trong khi triển khai giao diện. Câu hỏi khác là làm một mình. –

+0

@DavidHarkness bạn là đúng, không có nhiều SO lúc 5 giờ sáng cho tôi –

+2

Với tôi, có vẻ như lớp vô danh dự định của bạn là một chút tâm thần phân liệt. Đặc biệt nếu nó cần tương tác với các trường của lớp chứa. Tôi đề nghị bạn nên thiền định nếu những gì bạn thực sự cần là một thiết kế lại nhỏ. – Buhb

Trả lời

28

Một lớp ẩn danh có thể triển khai chính xác một giao diện hoặc mở rộng một lớp.

Một workaround là để tạo ra một lớp có tên mở rộng Base và thực hiện Interface1, và sau đó sử dụng như là lớp cơ sở cho lớp ẩn danh:

public abstract class Base1 extends Base implements Interface1 {} 

... 

protected Interface1 varClass1 = new Base1() { 
    ... 
+4

+1, giải pháp tốt đẹp! Chỉ có điều tôi sẽ thêm là nếu bạn cần làm điều này, thì đó là một gợi ý rằng bạn đang kéo dài ngoài việc sử dụng dự định của các lớp ẩn danh và có lẽ nên xem xét đầy đủ tên lớp bên trong thay vào đó. – mikera

+1

Để giới hạn phạm vi của 'Base1', bạn thậm chí có thể khai báo nó bên trong phương thức, ngay trước khi nó được sử dụng. – aioobe

+0

@aioobe - Bên trong phương thức *? * –

3

Trong khi nó không phải là tốt cho cả hai thừa kế một lớp và thực hiện một giao diện, những gì bạn có thể làm những gì có thể đạt được bằng cách sử dụng delegation.

Chỉ cần tạo một phiên bản Base trong trình khởi tạo của lớp ẩn danh của bạn và sử dụng các phương thức của nó từ các phương pháp bạn triển khai từ Interface1.

EDIT: Câu trả lời của tôi giả định rằng bạn chỉ muốn kế thừa từ Base vì triển khai của nó, không phải vì giao diện của nó. Đây là một giả định hợp lệ cho rằng giao diện của Base không hiển thị sau khi gán đối tượng cho biến Interface1. Do đó, tôi nghĩ tốt hơn nên sử dụng ủy quyền ở đây thay vì tạo một lớp học mới.