"是一个"VS"就像一个"关系,每个人的意思是什么,他们有什么不同?

Tam*_*ash 6 oop class-design class object-relationships

首先举例讨论:

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;
};
Run Code Online (Sandbox Code Playgroud)

我与老师讨论了" 是A "和" 就像A "的关系,他们有什么不同.

我的意见(我读到的某些地方,我记不住了)是" 是A "关系是在父类和从它继承的子类之间,并且它不受添加新方法或属性的影响,所以任何实例从子类" 是一个 "父类,在上面exmple,每天ExactDuplicate,ExtraMethodsExtraAttributes" 是A " Foo.虽然" is Like A "关系是从同一个Parent类继承的两个Child类之间的关系,但在上面的例子中,每个ExactDuplicate" 或类似 "每个ExtraMethods或者ExtraAttributes相反.

我的老师的意见是" 是A "关系是在父类和只有没有添加任何额外方法或属性的子类之间,因此在上面的例子中,和之间只有一个" 是A "关系.虽然"就像是一个"关系是父类和子类,其添加额外的方法或属性,所以在上面的示例之间,有一个" 就像是一个 "关系,并且每个的和.FooExactDuplicateFooExtraMethodsExtraAttributes

我认为,我老师定义的" 是A "关系并不是很有用,因为在大多数情况下,如果没有添加任何内容,就没有理由改变实现.这是一个观点.另一个,Car" 不是一个 " Vehicle,它实际上是" A " Vehicle,而Van" 就像A " Car,因为它们都具有某些特征.

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

另外,如果我的老师的意见是真实的,那么仅添加属性会使关系成为" 就像A "关系,还是需要添加新方法才能成为" 就像A "关系?什么(如果存在)是子类之间的关系.

希望我的建议清晰易懂.

任何帮助将不胜感激 :)

Jer*_*fin 3

由于这些术语通常被使用,你是对的,你的老师是错的。

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

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

  • 它被称为里氏替换原理,谷歌搜索它会给你更多细节。 (2认同)