6

議論する最初の例:

class Foo
{
    // Attributes:
    int attribute1, attribute2;

    // Methods:
    virtual void Foo1()
    {   /* With or without Implementation   */  }
    virtual void Foo2()
    {   /* Also with or without Implementation */ }
};

class ExactDuplicate: Foo   // No New Attributes or Methods
{   
    virtual void Foo1()
    {   /* A new Implementation */  }

    // Also there might be new Implementations to other methods
};

class ExtraMethods: Foo     // Having New Methods
{
    virtual void Foo3()
    {   /* Implementation   */  }
};

class ExtraAttributes: Foo  // Having New Attributes
{
    int attribute3;
};

「isA 」とisLikeA」の関係と、それらの違いについて、先生と話し合いました。

私の意見(私が覚えていないところを読んだ)は、「is A」の関係は、親クラスとそれから継承された子クラスの間にあり、新しいメソッドや属性を追加しても影響を受けないということです。子クラスから"はA "親クラス、上記の例では、すべての、、ExactDuplicateまたはExtraMethods"ExtraAttributesA "Fooです。「isLikeA」の関係は、同じParentクラスから継承された2つのChildクラスの間にありますが、上記の例では、すべてのExactDuplicateis Like」、everyExtraMethodsまたはExtraAttributes、およびその逆です。

私の先生の意見では、「is A」関係は親クラスと、余分なメソッドや属性を追加しない子クラスのみの間にあるため、上記の例では、との間の「isA」関係1つだけです。「 isLikeA 関係は、親クラスと子クラスの間にあり、メソッドまたは属性が追加されます。したがって、上記の例では、との間に「is Like A」の関係があり、との間にあります。FooExactDuplicateFooExtraMethodsExtraAttributes

ほとんどの場合、何も追加されていなければ実装を変更する理由がないため、私の先生が定義した「isA」の関係はあまり役に立ちませんこれがポイントです。もう1つは、Car「」「」のようVehicleではなく、実際には「」は「A」ですがVehicleVan「」は「A」のようCarです。どちらもいくつかの特性を関連付けているためです。

では、どちらが正しいのか、そしてその理由は何ですか?、説明をいただければ幸いです。

また、私の先生の意見が本当の場合、属性のみを追加すると、関係は「Aのような」関係になりますか、それとも「Aのような」関係になるために新しいメソッドを追加する必要がありますか?子クラス間の関係は(存在する場合)何ですか。

私の質問が明確で理解できることを願っています。

どんな助けでも大いに感謝されるでしょう:)

4

1 に答える 1

3

用語が一般的に使用されるので、あなたは正しく、あなたの先生は間違っています。

Is-Aは拡張を許可します。子は、親によって許可されていない属性、操作などを持つことができます。OOPの観点から、重要な点は、どのような状況でも親のインスタンスの代わりに子のインスタンスを使用できることです(編集:はい、おそらく言及する必要がありますが、リスコフの置換原則と呼ばれることがよくあります) LSPと略され、その創始者であるBarbaraLiskovにちなんで名付けられました。

Is-like-Aは、主に間違いを説明するために使用されます。明らかな例として、誰かが正方形を長方形から継承させようとした場合(またはその逆の場合)。どちらも他方のすべての特性を備えていないため、どちらも実際には他方の拡張ではありません。どちらか一方を他方に置き換えることが機能しない(提案された子が親であるという要件を満たしていない)か、何かを壊す可能性がある(親によって許可された変更)状況がある可能性があるため、どちらも他方から継承するべきではありません子供の不変量を壊します)。

于 2011-10-04T19:48:32.983 に答える