首先举个例子来讨论:
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”和“就像A“关系以及它们有何不同。
我的想法(我在某个地方读过,我不记得了)是“is A“关系是在父类和从其继承的子类之间,并且它不受添加新方法或属性的影响,因此来自子类的任何实例”is A" 父类,在上面的例子中,每个ExactDuplicate
, ExtraMethods
, or ExtraAttributes
"is A" Foo
。虽然“就像A" 关系是继承自同一个 Parent 类的两个 Child 类之间的关系,在上面的示例中,每个ExactDuplicate
"is Like" every ExtraMethods
or ExtraAttributes
,反之亦然。
我的老师的意见那是“is A“关系是在父类和子类之间,子类不添加任何额外的方法或属性,所以在上面的例子中只有一个”is A“ 之间的关系Foo
and ExactDuplicate
。虽然“就像A”关系是父类和添加额外方法或属性的子类之间的关系,因此在上面的示例中,有一个“就像A“ 之间的关系Foo
和每个ExtraMethods
and ExtraAttributes
.
我认为,“is A“我的老师定义的关系并不是真正有用,因为在大多数情况下,如果不添加任何内容,就没有理由更改实现。这是一点。另一个,Car
"不像" Vehicle
,实际上是“is A" Vehicle
,同时一个Van
"就像A" Car
,因为两者都关联了一些特征。
那么哪个是正确的,为什么?,我非常感谢解释。
另外,如果我老师的意见是正确的,那么仅添加属性是否会使关系成为“就像A“关系,或者需要添加新的方法才能成为”就像A“关系?子类之间的关系是什么(如果存在)。
希望我的问题是清楚易懂的。
任何帮助将不胜感激 :)
由于这些术语通常被使用,你是对的,你的老师是错的。
Is-A 确实允许扩展。子级可以具有父级不允许的属性、操作等。从 OOP 的角度来看,关键点是可以使用子实例来代替父实例。any(编辑:是的,我可能应该提到的是所谓的里氏替换原则,通常缩写为 LSP,以其创始人芭芭拉·里斯科夫(Barbara Liskov)命名)。
Is-like-A 主要用于描述错误——举一个明显的例子,当有人试图从矩形继承正方形时(反之亦然)。两者都不是对方的真正延伸,因为两者都不具有对方的所有特征。两者都不应该从另一个继承,因为可能存在一种情况,用一个替代另一个不起作用(提议的孩子不符合成为父母的要求)或可能破坏某些东西(父母允许的更改)会破坏孩子的不变量)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)