議論する最初の例:
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
"ExtraAttributes
はA "Foo
です。「isLikeA」の関係は、同じParentクラスから継承された2つのChildクラスの間にありますが、上記の例では、すべてのExactDuplicate
「is Like」、everyExtraMethods
またはExtraAttributes
、およびその逆です。
私の先生の意見では、「is A」関係は親クラスと、余分なメソッドや属性を追加しない子クラスのみの間にあるため、上記の例では、との間の「isA」関係は1つだけです。「 isLikeA 」関係は、親クラスと子クラスの間にあり、メソッドまたは属性が追加されます。したがって、上記の例では、との間に「is Like A」の関係があり、との間にあります。Foo
ExactDuplicate
Foo
ExtraMethods
ExtraAttributes
ほとんどの場合、何も追加されていなければ実装を変更する理由がないため、私の先生が定義した「isA」の関係はあまり役に立ちません。これがポイントです。もう1つは、Car
「」は「」のようVehicle
ではなく、実際には「」は「A」ですがVehicle
、Van
「」は「A」のようCar
です。どちらもいくつかの特性を関連付けているためです。
では、どちらが正しいのか、そしてその理由は何ですか?、説明をいただければ幸いです。
また、私の先生の意見が本当の場合、属性のみを追加すると、関係は「Aのような」関係になりますか、それとも「Aのような」関係になるために新しいメソッドを追加する必要がありますか?子クラス間の関係は(存在する場合)何ですか。
私の質問が明確で理解できることを願っています。
どんな助けでも大いに感謝されるでしょう:)