JavaがC ++のようなプライベート/保護された継承をサポートしないのはなぜですか?[閉まっている]


12

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 ++での「パブリック」継承のようです。

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


16
機能を省略する理由は不要です。機能を追加する理由(理想的には、いくつかの良いもの)が必要です。

1
これは投機的にしか答えることができず、終結を表明します。
ジミー・ホッファ

回答:


10

プライベート/保護された継承が提供するほとんどの利点は、カプセル化によって簡単に達成できます。トーマス・エディングは、プライベート/保護された継承を追加することで簡単にできるケースの良い例を提供しましたが、これらは有効なケースですが、プライベート/保護された継承を必要とせず、より「イディオマティック」な回避策が存在します(Javaでは少なくとも)。

Java言語の開発者は、プライベート/保護された継承(多重継承を含む)をサポートするために必要な複雑さのコストが、提供するメリットを上回ると考えていたようです。


1
C ++では、プライベート継承とメンバーとしての包含にいくつかの重要な違いがありますが、それらは初期化と多重継承の順序を中心に展開するため、Javaのより単純なオブジェクトシステムに変換されないことに注意してください。
Jan Hudec

2
-1:「任意の利点は、プライベート/保護された継承は、あなたがすることができます与えることを簡単にカプセル化によって実現しました。」違う。「ほとんどのメリット...」に同意するだろう
トーマスエディング

@ThomasEdingプライベート/保護された継承を介して達成できるが、カプセル化を介して達成できないもの(または、少なくともカプセル化を達成するためにかなりの労力を要するもの)の例を挙げてください。正直なところ、私は考えられませんが、私は確信することを受け入れています。
pswg

2
おっと、それについてすみません。C ++の例をいくつか示します。(1)クラスBABからプライベートに継承するA)として内部的に考慮し、何らかの方法でクラスを多態的に使用できるようにするとします。合成では、これを行うことができますが、非常に面倒です。ここではA'、使用する機能を実装する別のサブクラス(おそらく内部クラス)を作成する必要があります。あなたは手動でも、親への変更委任する必要がありますBクラスを(B作るA'友人を、A'への参照を受け入れますB)。これを行うのはそれほど難しくないと思いますが、コードに混乱が生じます。(
続き

2
...(2)でB保護された変数にアクセスしたい場合A、プライベート継承は再び構成を実装する方が簡単です。コンポジションを使用するA'と、上記と同様に実装したり、保護された変数へのアクセスを上げることができます。(3)テンプレートのインスタンス化全体でまったく同じ変数である単一の共有静的メンバー変数が必要だとします。解決策は、静的メンバーを持つ非テンプレート基本クラスからプライベートに継承することです。構成ではこの問題を解決できませんが、他の手法(他のクラスをメンバーと友達にするなど)では解決できます。
トーマスエディング

9

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.