【发布时间】:2011-11-30 23:27:31
【问题描述】:
首先讨论一个例子:
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;
};
我和我的老师讨论了“is A”和“is Like A”的关系以及它们有何不同。
我的观点(我在不记得的地方读过)是“is A”关系是在父类和继承的子类之间形成它,并且它不受添加新方法或属性的影响,因此子类中的任何实例“is A”父类,在上面的示例中,每个ExactDuplicate,ExtraMethods,或ExtraAttributes“是 A”Foo。虽然 "is Like A" 关系是在从同一个 Parent 类继承的两个 Child 类之间,但在上面的示例中,每个 ExactDuplicate "is Like" 每个 @987654327 @ 或 ExtraAttributes,反之亦然。
我的老师的意见是“is A”的关系是父类和不添加任何额外方法或属性的子类之间的关系,所以在在上面的例子中,Foo 和 ExactDuplicate 之间只有一个“is A”关系。虽然 "is Like A" 关系是在父类和添加额外方法或属性的子类之间,所以在上面的示例中,有一个 "is Like A" Foo 与 ExtraMethods 和 ExtraAttributes 之间的关系。
我认为,我的老师定义的“is A”关系并不是很有用,因为在大多数情况下,如果不添加任何内容,就没有理由更改实现。这是一个点。另一个,Car“不像”Vehicle,它实际上“是一个”Vehicle,而Van“是像 A" Car,因为两者都关联了一些特征。
那么哪个是正确的,为什么?,我非常感谢您解释一下。
另外,如果我老师的意见是真实的,是否只添加属性会使关系成为“is Like A”关系,还是需要添加新方法才能成为“is Like”一个”的关系?以及子类之间的关系是什么(如果存在)。
希望我的问题清晰易懂。
任何帮助将不胜感激:)
【问题讨论】:
标签: oop class class-design object-relationships