2011-10-13 9 views
20

Có thể không thực hiện được các bước sau (Tôi nhận được lỗi biên dịch: "Phương thức kế thừa A.doSomthing (int) không thể ẩn phương thức trừu tượng công khai trong B"):Java: mở rộng một lớp và triển khai một giao diện có cùng phương thức

public class A { 
    int doSomthing(int x) { 
     return x; 
    } 
} 

public interface B { 
    int doSomthing(int x); 
} 

public class C extends A implements B { 

    //trying to override doSomthing... 

    int doSomthing(int x) { 
     return doSomthingElse(x); 
    } 
} 

giả sử tôi được phép thay đổi không phải A hoặc B, câu hỏi của tôi là tôi làm cách nào xác định C trong một cách như vậy mà nó sẽ thừa hưởng từ cả hai A và B (giả sử rằng nó là cần thiết đối với một số khuôn khổ C sẽ là cả hai thể hiện của A và B).

Hoặc nếu không, bạn sẽ giải quyết vấn đề này bằng cách nào?

Cảm ơn!

+0

Đề nghị thông báo lỗi của bạn. Không có gì rõ ràng là sai ở đây, ngoại trừ có lẽ một thiếu sót @Overrides nếu bạn đang sử dụng 1,6. – bmargulies

+2

@ bmargulies, không có 'công khai' và ghi đè chỉ là một sự phiền toái tùy chọn. – bestsss

Trả lời

24

làm phương pháp nào

public class C extends A implements B { 

    //trying to override doSomthing... 

    public int myMethod(int x) { 
     return doSomthingElse(x); 
    } 
} 

phương pháp giao diện luôn public

hoặc chỉ sử dụng thành phần thay vì thừa kế

+0

Cảm ơn bạn và tất cả những người phản hồi khác. Nó giải quyết vấn đề! – rapt

+0

Có thể cho một biến cho cả hai là một cá thể lớp và kế thừa một giao diện? Trong ví dụ của bạn, nó sẽ giống như 'new C() thực hiện X' giả sử X là giao diện – Vadorequest

+1

@Vadorequest triển khai hoặc mở rộng được thực hiện ở cấp lớp chứ không phải cấp độ cá thể. Để thực hiện X bạn cần phải thêm nó vào danh sách giao diện: 'public class C mở rộng A thực hiện B, X {...}' –

2

này đã làm với tầm nhìn. Bạn đang sử dụng chế độ hiển thị default (không có công cụ sửa đổi) trong C cho myMethod nhưng cần phải là public theo giao diện B.

Bây giờ bạn có thể nghĩ rằng bạn sử dụng khả năng hiển thị default cho tất cả trong số họ, vì trong không A, B, cũng không C cậu dứt khoát chọn một trong public, private, hoặc protected. Tuy nhiên, giao diện sử dụng public cho dù bạn có chỉ định rõ ràng như vậy hay không.

+0

Cảm ơn bạn! Tôi thực sự biết điều đó nhưng bạn đã nhắc tôi. – rapt

0

Chỉ cần thực hiện phương thức public khi ghi đè nó trong C sẽ thực hiện.

7

Phương pháp này doSomethis()gói tin trong lớp A:

public class A { 
    int doSomthing(int x) { // this is package-private 
     return x; 
    } 
} 

Nhưng đó là công trong giao diện B:

public interface B { 
    int doSomthing(int x); // this here is public by default 
} 

biên dịch được lấy doSomething() thừa hưởng bởi C từ A là gói riêng tư khi triển khai phiên bản trong B là công khai. Đó là lý do tại sao nó phàn nàn -

"The inherited method A.doSomthing(int) cannot hide the public abstract method in B"

Bởi vì, trong khi trọng một phương pháp mà bạn không thể thu hẹp xuống mức truy cập của phương pháp.

Giải pháp rất dễ dàng, trong lớp C -

@Override 
public int doSomthing(int x) { 
    // ... 
}