web-dev-qa-db-ja.com

JavaがC ++のようなプライベート/保護継承をサポートしないのはなぜですか?

C++でクラスを継承しながら、ユーザーは次のようなアクセス指定子を指定できます。

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.
};

しかし、Javaでは同じことはできません。つまり、Javaで拡張すると、C++の「パブリック」継承のようになります。

誰かがこの理由を説明できますか?

12
Rumit Parakhiya

プライベート/保護された継承がもたらすメリットのほとんどは、カプセル化によって簡単に実現できます。 Thomas Eding は、プライベート/保護された継承を追加することで簡単にできるケースの良い例をいくつか提供していますこれらは有効なケースであり、プライベート/保護された継承を必要とせず、より「慣用的」な回避策が存在します(少なくともJava))。

Java言語の開発者は、プライベート/保護された継承(多重継承を含む)をサポートするために必要な複雑さのコストが、それが提供するメリットを上回ると明らかに感じました。

10
p.s.w.g

Javaには多重継承がなく、すべてをObjectから(パブリックに)継承する必要があるため、Javaまたは保護された継承は有効なプログラムを生成します。