【问题标题】:"is A" VS "is Like A" relationships, what does each one mean and how do they differ?“is A” VS “is Like A” 关系,每一个是什么意思,它们有什么不同?
【发布时间】: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”父类,在上面的示例中,每个ExactDuplicateExtraMethods,或ExtraAttributes是 AFoo。虽然 "is Like A" 关系是在从同一个 Parent 类继承的两个 Child 类之间,但在上面的示例中,每个 ExactDuplicate "is Like" 每个 @987654327 @ 或 ExtraAttributes,反之亦然。

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

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

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

另外,如果我老师的意见是真实的,是否只添加属性会使关系成为“is Like A”关系,还是需要添加新方法才能成为“is Like”一个”的关系?以及子类之间的关系是什么(如果存在)。

希望我的问题清晰易懂。

任何帮助将不胜感激:)

【问题讨论】:

    标签: oop class class-design object-relationships


    【解决方案1】:

    正如通常使用的术语,你是对的,你的老师是错的。

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

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

    【讨论】:

    • 毫无疑问,所有子类都与父类具有“是”的关系。您可以将父类引用用于子类,因此它符合要求。它“是”父类的一个实例。
    • 它被称为 Liskov 替换原则,谷歌搜索会为您提供更多详细信息。
    • 从数学上讲,正方形“是”矩形,但是在限制而不是扩展时,继承效果不佳。
    • (另外,如果我错了,请纠正我,但是如果涉及可变性,从矩形继承的正方形不是只会使 LSP 失败吗?)
    • 一个 immutable Square 可以定义为一个不可变 Rectangle 的子类型。它很可能不会节省任何空间,因为矩形需要高度和宽度字段,并且子类型不能从其父类型中省略字段,但是如果可以在正方形上执行操作,这样的子类型可能很有用无法在矩形上完成。唯一潜在的技巧是关于相等性,因为正方形很可能被认为与具有相似属性的矩形“不相等”。
    猜你喜欢
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2020-02-15
    • 2016-07-09
    • 2019-08-13
    • 2021-09-18
    相关资源
    最近更新 更多