4

特にC++では、一般的にはオブジェクト指向設計の原則として、次のことを行うことに何か問題がありますか?それは実際に行われていますか?それが明確な設計上の欠陥を示している場合、良い代替案は何ですか?何か利点はありますか?

class Property {};
class CompositeProperty : public Property 
{
    ...
    private:
        std::vector<Property> m_properties;
};

具体的には、派生クラスに基本クラスオブジェクトを含めることができますか?

背景を少し見てみると、これはXML構造をモデル化/ミラーリングするために使用されていましたが、設計は、通常は努力している継承と構成の関係に直面していると感じました。

4

5 に答える 5

6

設計に欠陥はありません。実際、この設計は、よく知られている非常に便利な複合パターンから一歩離れたところにあるだけです。ただし、実装には重大な欠陥があります。

ポインタを集約するのではなく、CompositePropertyのインスタンスを集約します。これにより、ポリモーフィックPropertyの要素を使用する機能が失われます。CompositePropertyこの問題に対処するには、インスタンスのベクトルをポインター (できればスマート ポインター) のベクトルに置き換える必要があります。

複合パターンの古典的な場所は、式ツリーの表現です。抽象ベースから始めて、定数、変数、関数呼び出し、単項式、二項式、条件などの表現を追加します。定数や変数などの式は他の式を参照しませんが、単項式、2 項式、関数呼び出しなどの式は参照します。これにより、オブジェクト グラフが再帰的になり、任意の複雑さの式を表すことができます。

于 2012-08-10T11:08:54.530 に答える
2

何も問題はありません。

次の例を見てみましょう (これは C# ですが、十分に単純なはずです)。ここでは、それぞれが継承されたインスタンスのインスタンスを含む 2 つのサブクラスを定義します。

public class Person
{
    public string Name;
}

public class MalePerson : Person
{
    public Person BestFriend;
}

public class FemalePerson : Person
{
    public Person BestFriend;
}

私の経験では、サブクラスにスーパークラスのインスタンスを含めることは、異種オブジェクト間の階層をモデル化するため、またはできるだけ少ない仮定でオブジェクトを参照するために最も一般的に使用されます。

于 2012-08-10T11:10:51.097 に答える
2

まったく問題はありませんが、基本/親クラスへのポインターの使用を検討することをお勧めします。これにより、オブジェクトのポリモーフィックな動作が可能になります。派生クラスのインスタンスをベクトルにそのまま追加すると、オブジェクトのスライスに悩まされます。

于 2012-08-10T11:11:04.647 に答える
2

具体的には、子クラスに親クラスのオブジェクトを含めることができますか?

要するにYES

于 2012-08-10T11:06:11.850 に答える
2

複合パターンをご覧ください。

コンポジットは、クライアントがオブジェクトの構成と個々のオブジェクトの違いを無視する必要がある場合に使用できます。プログラマーが複数のオブジェクトを同じ方法で使用していて、それぞれのオブジェクトを処理するコードがほとんど同じであることに気付いた場合、コンポジットは適切な選択です。この状況では、プリミティブとコンポジットを同種のものとして扱うほうが複雑ではありません。

于 2012-08-10T11:06:32.257 に答える