gpt4 book ai didi

oop - "is A"VS "is Like A"关系,每一个的含义是什么以及它们有何不同?

转载 作者:行者123 更新时间:2023-12-03 00:31:22 25 4
gpt4 key购买 nike

首先讨论一个例子:

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”关系以及它们有何不同。

我的观点(我在不记得的地方读过)是“是A”关系是在父类和继承的子类之间形成它,并且它不会受到添加新方法或属性的影响,因此子类中的任何实例“都是 A ” 父类,在上面的示例中,每个 ExactDuplicateExtraMethodsExtraAttributesis AFoo。虽然“is Like A”关系是在从同一父类继承的两个子类之间,但在上面的示例中,每个 ExactDuplicateis Like>”每个 ExtraMethodsExtraAttributes,反之亦然。

我老师的意见是,“is A”关系是在父类和子类之间,子类不添加任何额外的方法或属性,所以在上面的示例中,FooExactDuplicate 之间只有一个“is A”关系。虽然“is Like A”关系是在父类和添加额外方法或属性的子类之间,所以在上面的示例中,有一个“is Like A>”FooExtraMethodsExtraAttributes 之间的关系。

我认为,我的老师定义的“is A”关系并不是很有用,因为在大多数情况下,如果不添加任何内容,就没有理由更改实现。这是一点。另外,一辆汽车不像车辆,它实际上“是一辆车辆,而Van就像A汽车,因为两者都关联了一些特征。

那么哪个是正确的,为什么?,我非常感谢解释。

另外,如果我老师的观点是正确的,那么仅添加属性是否会使关系成为“is Like A”关系,或者需要添加新方法才能成为“is Like”关系”关系?子类之间的关系是什么(如果存在)。

希望我的问题清晰易懂。

任何帮助将不胜感激:)

最佳答案

按照这些术语的常用用法,你是对的,而你的老师是错的。

Is-A 确实允许扩展。子级可以具有父级不允许的属性、操作等。从 OOP 的角度来看,关键的一点是,在任何情况下都可以使用子实例来代替父实例(编辑:是的,我应该提到的是称为里氏替换原理,通常缩写为 LSP,以其创始人 Barbara Liskov 命名)。

Is-like-A 主要用于描述错误——举一个明显的例子,当有人试图从矩形继承正方形时(反之亦然)。两者都不是对方的真正延伸,因为两者都不具有对方的所有特征。两者都不应该从另一个继承,因为可能存在一种情况,用一个替代另一个不起作用(提议的 child 不符合成为 parent 的要求)或可能破坏某些东西( parent 允许的更改)会破坏子级的不变量)。

关于oop - "is A"VS "is Like A"关系,每一个的含义是什么以及它们有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7653185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com