2012-07-14 31 views
9

Trong Java, khi tôi ghi đè lên một phương thức mà trình biên dịch gắn cờ bất kỳ nỗ lực nào để thu hẹp khả năng hiển thị dưới dạng lỗi. Ví dụ: Tôi không thể ghi đè phương thức công khai như được bảo vệ, trong khi tôi có thể ghi đè phương thức được bảo vệ là công khai.Tại sao nó không được phép thu hẹp phạm vi của một phương thức trong khi ghi đè

Tôi muốn biết quyết định/suy nghĩ thiết kế đằng sau quy tắc này.

+0

Câu hỏi này được hỏi một vài ngày trước, nhưng điều gì sẽ là điểm? –

+1

http://stackoverflow.com/q/11343763/1475461 xem xét điều này để thảo luận đã có tuần trước về vấn đề này –

Trả lời

14

Một lớp con phải luôn thỏa mãn hợp đồng của siêu lớp. Xem Liskov Substitution principle.

Khả năng hiển thị của các phương thức là một phần của hợp đồng này. Vì vậy, mọi thứ hiển thị công khai trong lớp cha cũng sẽ được công khai trong lớp con.

+1

Câu trả lời RẮN ....! –

14

Xem xét một lớp học B được kế thừa từ A. A.m() là công khai. Bây giờ hãy xem xét mã này:

A obj = new B(); 
obj.m(); 

Cuộc gọi này có được phép không? Có, phải bởi vì obj là một đối tượng thuộc loại A! Nó cũng là một đối tượng kiểu B, nhưng điều đó không nhất thiết phải là đối tượng sử dụng đối tượng.

Mọi đối tượng thuộc loại A phải tuân theo hợp đồng (giao diện) cho A. B kéo dài A và do đó cũng phải tuân theo hợp đồng đó.

3

Trong khi vượt qua hoặc thực hiện cấp độ truy cập, chúng tôi phải đi cùng cấp truy cập hoặc rộng hơn với cấp truy cập đó.

private < (default) < protected < public 

Công khai rộng hơn nhiều nhất.

Trong giao diện, tất cả thành viên là công khai mặc định. Vì vậy, Trong khi thực hiện hoặc trên ridding chúng ta phải đi cho công chúng.

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