Tại sao Java không hỗ trợ kế thừa riêng tư / được bảo vệ như C ++? [đóng cửa]


12

Trong khi kế thừa một lớp trong C ++, người dùng có thể chỉ định trình xác định truy cập như,

class Base
{
    public int mem1;
    protected in mem2;
};

class Derived1 : **private** Base
{
    // mem1 will be private here.
    // mem2 will be private here.
};

class Derived2 : **protected** Base
{
    // mem1 will be protected here.
    // mem2 will be protected here.
};

class Derived2 : **public** Base
{
    // mem1 will be public here.
    // mem2 will be protected here.
};

Nhưng điều tương tự là không thể có trong Java, tức là mở rộng trong java luôn giống như thừa kế "công khai" trong C ++.

Ai đó có thể giải thích lý do cho điều này?


16
Người ta không cần một lý do để bỏ qua một tính năng, người ta cần một lý do (lý tưởng là một vài tính năng tốt) để thêm nó.

1
Điều này chỉ có thể được trả lời suy đoán, bỏ phiếu để đóng.
Jimmy Hoffa 17/03/13

Câu trả lời:


10

Hầu hết các lợi ích mà thừa kế tư nhân / được bảo vệ mang lại cho bạn có thể dễ dàng đạt được thông qua việc đóng gói. Thomas Eding đã cung cấp một số ví dụ điển hình về các trường hợp có thể được thực hiện dễ dàng hơn với việc bổ sung quyền thừa kế riêng tư / được bảo vệ và trong khi đây là các trường hợp hợp lệ, các cách giải quyết tồn tại không yêu cầu thừa kế riêng tư / được bảo vệ và 'thành ngữ' hơn (trong Java tại ít nhất).

Các nhà phát triển ngôn ngữ Java rõ ràng cảm thấy rằng chi phí phức tạp cần thiết để hỗ trợ thừa kế riêng tư / được bảo vệ (bao gồm nhiều kế thừa) vượt xa lợi ích mà nó sẽ mang lại.


1
Điều đáng chú ý là trong C ++ có một số khác biệt quan trọng giữa thừa kế riêng và bao gồm là thành viên, nhưng chúng xoay quanh thứ tự khởi tạo và nhiều kế thừa và do đó không chuyển sang hệ thống đối tượng đơn giản hơn của Java.
Jan Hudec

2
-1: " Bất kỳ lợi ích nào mà thừa kế riêng tư / được bảo vệ mang lại cho bạn đều có thể dễ dàng đạt được thông qua việc đóng gói." Sai lầm. Tôi đồng ý với " Hầu hết các lợi ích ..."
Thomas Eding

@ThomasEding Bạn có thể đưa ra một ví dụ về một cái gì đó có thể đạt được thông qua thừa kế riêng tư / được bảo vệ nhưng không phải thông qua đóng gói (hoặc ít nhất là một cái gì đó sẽ có nhiều công việc phải hoàn thành với đóng gói)? Thành thật tôi không thể nghĩ ra một ai, nhưng tôi sẵn sàng để bị thuyết phục.
pswg

2
Rất tiếc, xin lỗi vì điều đó. Dưới đây là một số ví dụ trong C ++. (1) Giả sử bạn muốn xem xét bên trong lớp Bnhư một A( Bkế thừa riêng tư từ đó A) để bạn có thể sử dụng nó một cách đa hình trong một số phương thức. Với thành phần, điều này có thể được thực hiện, nhưng nó phức tạp hơn nhiều. Ở đây bạn sẽ cần tạo một lớp con riêng biệt A'(có thể là một lớp bên trong) thực hiện chức năng bạn sử dụng. Bạn cũng sẽ cần phải tự ủy thác thay đổi đối với cha mẹ Blớp ( Blàm cho A'một người bạn, A'chấp nhận một tham chiếu đến B). Tôi cho rằng điều này không quá khó để làm, nhưng nó phát sinh một mớ hỗn độn trong mã. (Tiếp)
Thomas Eding

2
... (2) Nếu bạn muốn Btruy cập các biến được bảo vệ trong A, kế thừa riêng lại đơn giản hơn để thực hiện trên thành phần. Với thành phần, bạn có thể thực hiện A'tương tự như trên và / hoặc tăng quyền truy cập của các biến được bảo vệ. (3) Giả sử bạn muốn một biến thành viên tĩnh được chia sẻ là cùng một biến chính xác trong các lần khởi tạo mẫu. Một giải pháp là kế thừa một cách riêng tư từ một lớp cơ sở không có templated có thành viên tĩnh. Thành phần không thể giải quyết vấn đề này, mặc dù các kỹ thuật khác có thể (chẳng hạn như kết bạn với một số lớp khác với thành viên).
Thomas Eding

9

Vì Java không có nhiều kế thừa và mọi thứ phải được kế thừa (công khai) từ Objectđó, không có nơi nào trong Java nơi thừa kế riêng tư hoặc được bảo vệ sẽ mang lại một chương trình hợp lệ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.