2015-07-07 15 views
5

Vì vậy, chúng tôi cóKhông thể truy cập phương pháp được bảo vệ từ lớp con

public abstract class A{ 
    protected abstract String f(); 
} 

public class B extends A{ 
    protected String f(){...} 
} 

public class C extends A{ 
    protected String f(){ 
     A b = (A) Class.forName("B", true, getClass().getClassLoader()).newInstance(); 
     return b.f(); 
} 

này không cho phép tôi để truy cập b.f(), nói rằng B.f() là trong phạm vi bảo vệ, tuy nhiên f được bảo vệ bởi A, và kể từ khi C mở rộng A, nó cũng sẽ có quyền truy cập vào f().

+0

Tại sao không tạo thể hiện mới như: A b = (A) mới B(); ? – Dmitry

+0

B chỉ có sẵn khi chạy. Nếu bạn thực sự muốn biết, B là 'com.android.okhttp.HttpsHandler' và A là' URLStreamHandler' –

+0

Bạn có thể giải quyết trường hợp của mình thông qua phản ánh, nhưng sẽ hữu ích hơn nếu bạn đăng sự cố * ban đầu * của mình. Phương thức 'HttpsHandler' nào bạn đang cố gắng gọi và tại sao bạn cần nó. Xem [vấn đề XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Cân nhắc việc mở một câu hỏi mới với vấn đề ban đầu của bạn. –

Trả lời

2

Công cụ sửa đổi được bảo vệ chỉ định rằng thành viên chỉ có thể được truy cập trong gói riêng của nó (như với gói riêng) và, ngoài ra, bởi một lớp con của lớp trong gói khác.

Nếu bạn muốn truy cập vào B.f(), bạn nên có lớp C được định nghĩa trong gói giống như B.

+0

nhưng mức độ tiếp cận này có thể đạt được bằng cách sử dụng không có công cụ sửa đổi (được gọi là "gói riêng tư"). Nếu một lớp con truy cập các phương thức được bảo vệ phải trong cùng một gói thì điều đó có nghĩa là các gói bổ trợ riêng tư và được bảo vệ có giống nhau không? Tôi nghĩ rằng lớp con truy cập các phương thức được bảo vệ có thể nằm trong bất kỳ gói nào. Đúng nếu tôi không đúng. – Dmitry

+0

Bạn đã đúng. Câu trả lời cố gắng giải quyết vấn đề như được nêu trong câu hỏi. –

+1

Bây giờ tôi thấy. Nhưng biến b là loại A, và thể hiện của B() được đúc thành A. Thời điểm này thú vị tại sao truy cập là bất hợp pháp – Dmitry

0

Không vì trình biên dịch không biết liệu b là một thể hiện của B, C, hoặc các lớp bên ngoài khác.

Giả sử có một lớp học D sao cho D extends A trong gói khác. Nếu b là một trường hợp của D (trình biên dịch không biết) b.f() nên bị cấm nếu truy cập là protected (không thể truy cập bởi các lớp trong các gói khác).

+0

miễn là b là A, và A có 'f', nó có vấn đề gì? –

+0

@ doom777 giả sử bây giờ 'b' là một' D', trong đó 'D mở rộng A' và được định nghĩa trong một gói khác với phương thức' protected' 'f()'. Xem xét 'D',' A' nằm trong "một gói khác", vì vậy 'A' không thể truy cập các phương thức' được bảo vệ' trong 'D'. Tuy nhiên, biên dịch không biết 'b' là' B', 'C' hay' D', vì vậy 'b.f()' phải bị cấm (trong trường hợp 'b' là một thể hiện của' D'). – tony200910041

+0

Tôi nghĩ rằng vì 'f' đã được định nghĩa ban đầu trong' A', nên luôn luôn là con của 'A' hoặc tự do, và có sẵn cho tất cả' A 'và các lớp con của nó –

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