2012-03-03 23 views
7

Giả sử có các lớp cơ sở sau đây:Tại sao tôi không thể gọi một phương thức được bảo vệ từ lớp kế thừa trong một gói khác trong Java?

package bg.svetlin.ui.controls; 

public abstract class Control { 
    protected int getHeight() { 
     //.. 
    } 
    //... 
} 

Ngoài ra, trong cùng một gói, có một lớp kế thừa:

package bg.svetlin.ui.controls; 

public abstract class LayoutControl extends Control { 
    public abstract void addControl(Control control); 
    //... 
} 

Sau đó, có một lớp thứ ba trong một gói khác:

package bg.svetlin.ui.controls.screen; 

public abstract class Screen extends LayoutControl { 
    //... 
} 

Và cuối cùng, có lớp triển khai, một lần nữa trong một gói khác:

package bg.svetlin.ui.controls.screen.list;  

public class List extends Screen { 

    private final Vector controls = new Vector(); 

    public void addControl(Control control) { 
     height += control.getHeight(); 
     controls.addElement(control); 
    } 
} 

Mặc dù List thừa hưởng từ Control, và getHeight()protected, có các lỗi sau:

getHeight() has protected access in bg.svetlin.ui.controls.Control

Tôi đã kiểm tra rằng hàng nhập khẩu của tôi là đúng. Tôi đang sử dụng NetBeans.

Bất kỳ ý tưởng nào là sai? Tôi nghĩ rằng các trường và phương thức protected có thể hiển thị cho trẻ em ngay cả khi các trường này nằm trong một gói khác.

Cảm ơn!

+1

Trong lớp trừu tượng của bạn, phương thức là 'getWidth()', trong lớp con bạn đang sử dụng 'getHeight()'. Đây có phải chỉ vì đó là mã ví dụ? – Ash

+0

Có. Cảm ơn vì đã phát hiện ra điều này. –

Trả lời

17

I thought protected fields and methods are visible to the children even if the latter are in a different package.

Đúng vậy. Bản thân lớp này có quyền truy cập vào các thành viên được bảo vệ được kế thừa. Tuy nhiên, những gì bạn đang cố gắng thực hiện để gọi phương thức getHeight trên một số tham chiếu điều khiển. Bạn chỉ được phép gọi số điện thoại này trên ví dụ này!

Đối với một sự hiểu biết tốt hơn, tôi xin trích dẫn Kathy Sierra của SCJP Preparation Guide:

But what does it mean for a subclass-outside-the-package to have access to a superclass (parent) member? It means the subclass inherits the member. It does not, however, mean the subclass-outside-the-package can access the member using a reference to an instance of the superclass. In other words, protected = inheritance. The subclass can see the protected member only through inheritance.

+0

Làm thế nào tôi có thể tạo một phương thức chỉ có sẵn cho một lớp và các lớp con của nó? Cảm ơn! –

+0

Như tôi đã nói, nó ** có ** cho lớp con của bạn. Nhưng bạn chỉ được phép gọi nó trên ** tham chiếu ** này, chẳng hạn như 'this.getHeight()' (* điều này * là tùy chọn của khóa học). Đó là một thực tế phổ biến mặc dù, để thực hiện một phương pháp accessor ** công **. – jFrenetic

+0

Các kích thước và vị trí sẽ được tổ chức tự động bởi thư viện của tôi, vì vậy tôi muốn để chúng riêng tư vào thư viện. Có vẻ như tôi sẽ phải công khai họ. Cảm ơn! –

1

Bạn nói đúng. Bất kỳ thành viên protected hoặc method nào có thể truy cập từ lớp trẻ em, nhưng bạn muốn truy cập vào phương pháp được bảo vệ của cá thể tham số theo phương thức addControl. Bạn chỉ có thể truy cập vào phương thức protected của List lớp (this.getHeight())

Các vấn đề liên quan