6

オブジェクト指向プログラミングの概念に問題があります。クラスを拡張するのと、クラス内で新しいオブジェクトを作成するのとでは、どちらがよいでしょうか? サブクラスを拡張するのではなく、呼び出し元のクラス内でそのサブクラスの新しいインスタンスを作成するのは、どのような状況ですか? 例は Java ですが、概念は他の OOP 言語でも機能すると思います。

あなたの洞察に感謝します

class Mini {
// I want to use the members of this class in another class
    int myInt;

    public Mini(int myInt){
        this.myInt = myInt;
    }

    public int myMethod(){
        return this.myInt;
    }
}

// should I create a new instance of Mini here?
class Maxi {
    Mini myMini = new Mini(5);

    public Maxi(){
        int miniInt = myMini.myMethod();
        System.out.print(miniInt );
    }
}

// or should I have Maxi extend Mini?
class Maxi extends Mini {
    public Maxi(int myInt){
        System.out.print(this.myInt);
    }
}
4

5 に答える 5

4

is-a関係がある場合、クラスを拡張します。たとえば、 aCatAnimalです。ACatは a ではありませんが、 を使用するCatFood場合があります CatFood

あなたの場合、何が何であるかはわかりませんが、のようにはMiniMaxi聞こえず、むしろそれを使用しています。MaxiMini

一般に、特に Java のような単一継承言語では、継承よりも合成 (オブジェクトを使用) を優先するようにしてください。

于 2013-10-28T18:05:56.623 に答える
1

その質問に対する最良の答えは、別の質問です。クラス B はクラス A を使用しますか、それともクラス B はクラス A に基づいていますか?

于 2013-10-28T18:07:51.073 に答える
0

「is-a」と「has-a」の区別は非常に重要で重要です。「is-a」関係がわからない場合は、継承を使用しないでください。したがって、概念的に B が A ではないことがわかっている場合は、B の継承を使用しないでください。また、一部の機能を再利用するためだけにクラスから継承したい場合は、決してそれを行わないでください。「has-a」構成/集約手法を使用してください。 .

于 2013-10-28T19:00:38.037 に答える
0

自問すべき質問の 1 つは、このクラスには他にどのような用途があるかということです。サブクラスでこのクラスの機能が引き続き必要ですか? mini も継承するクラスが増える予定はありますか?

目標は、重複を保存することです。確認するには、ユースケースについて詳しく知る必要があります。

トップクラスを拡張し、その機能と変数を使用するものが複数ある場合にのみ、実際に継承します。メソッド シグネチャ インターフェイスを使用しているだけの場合は、通常、より適切な方法です。

于 2013-10-28T18:08:21.400 に答える
0
  • 最初のケースは、has-a という名前の集約関係です。クラス Maxi には属性があり、そのタイプはクラス Mini です。
  • 2 番目は、Is-a という名前の継承関係です。クラス Mini はクラス Maxi のサブクラスであり、Maxi はクラス Mini のサブクラスです。クラス Maxi が拡張されると、新しいクラスはクラス Mini のすべてのフィールド (保護またはパブリック データおよびメソッド) を継承します。
于 2013-10-28T18:19:13.443 に答える