代码之家  ›  专栏  ›  技术社区  ›  ckv

正当继承

  •  2
  • ckv  · 技术社区  · 14 年前

    什么是适当的继承?

    4 回复  |  直到 14 年前
        1
  •  3
  •   Elemental    9 年前

    我想补充一下贾斯汀和巴克斯特的话。

    正确继承这个术语并没有很好的定义。正确使用继承是一个相当主观的问题。。。

    考虑以下示例:

    • 接口: Bird
    • Ostrich

    应该 鸵鸟 ? 从动物学的角度来看是有道理的,但从计算机科学的角度来看。。。没那么多。如果 有一个 fly 方法,那我该怎么处理 Ostrich::fly

    在CS社区有一场战争。事实上,你会经常看到书在哪里 Circle 继承自 Ellipse (或者反过来说)从CS的角度看,这是没有意义的。

    所以我自己的小定义是:

        2
  •  4
  •   Community Ian Goodfellow    4 年前

    This thread 总结得很好:

    • 当派生类“是”基类的专用类型时,就会发生正确的继承。猫是一种动物。

    • 当一个类仅仅为了代码重用而从中继承,而没有任何其他关系时,就会发生不正确的继承。示例Cat继承自引擎。猫不是发动机,但它既是发动机又是猫的呼噜声。

        3
  •  1
  •   Booboo    3 年前

    一般认为类的方法是与类的客户机创建契约:它保证只要调用满足某些前提条件的方法,该方法就会提供某些结果。”正确的“继承”是这样的:子类实例可以替换其父类而不违反父类的约定。也就是说,子类的任何方法都不应重写其基类的方法,这些方法要求更严格的前提条件,也不应提供更多“更少”的结果。返回到C++,因为在需要前一个公共和私有继承之间有明显的区别,因此可以用一个子类实例代替基类实例,所以通常认为“正确”的替换是语义正确的。否则为什么不使用私有继承呢?

    Ostrich Bird ? 这取决于你对事物的抽象 类有一个方法 Bird::fly 那确实是有形的,但是 Ostrich::fly 重写它以抛出一个异常,从而比它的基类传递“更少”,我会说不 fly 方法(还有另一个子类 Flying_Bird

    我的答案是C++所持有的并不是任何面向对象语言的坏指南。在像Python这样的语言中,多态性不需要继承层次结构,人们可能更倾向于仅仅为了代码重用而使用继承。如果这种重用有很好的文档记录,可能就不是问题了。但是 当我看到一个类层次结构时,我的期望是一个子类可能会被多态地使用,因此子类的一个实例可以被基类的一个实例所替代,从而遵守 Liskov substitution principle

        4
  •  0
  •   Baxter    14 年前