Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
没有继承的OOP重用:如何;“真实世界”;这是实用的吗?_Oop_Inheritance_Composition - Fatal编程技术网

没有继承的OOP重用:如何;“真实世界”;这是实用的吗?

没有继承的OOP重用:如何;“真实世界”;这是实用的吗?,oop,inheritance,composition,Oop,Inheritance,Composition,本文描述了一种我觉得有趣的OOP方法: 如果对象作为对象存在呢 封装,以及通信 通过短信?如果代码重用失败了怎么办 与继承无关,但 使用组合、委派,甚至 老式的辅助对象或任何 程序员认为合适的技术? 本体论不会消失,但它会消失 与实现分离 没有继承或依赖于类层次结构的重用思想是我发现最令人震惊的,但是这有多可行呢 给出了一些示例,但我不太明白如何更改当前代码以适应这种方法 那么,这种方法的可行性如何?还是真的不需要更改代码,而是需要一种基于场景的方法,即“仅在需要或最佳时使用” 编辑:哎呀,我忘

本文描述了一种我觉得有趣的OOP方法:

如果对象作为对象存在呢 封装,以及通信 通过短信?如果代码重用失败了怎么办 与继承无关,但 使用组合、委派,甚至 老式的辅助对象或任何 程序员认为合适的技术? 本体论不会消失,但它会消失 与实现分离

没有继承或依赖于类层次结构的重用思想是我发现最令人震惊的,但是这有多可行呢

给出了一些示例,但我不太明白如何更改当前代码以适应这种方法

那么,这种方法的可行性如何?还是真的不需要更改代码,而是需要一种基于场景的方法,即“仅在需要或最佳时使用”

编辑:哎呀,我忘了链接:这里是

我肯定你听说过“总是喜欢组合而不是继承”

这个前提的基本思想是将具有不同功能的多个对象放在一起,以创建一个功能齐全的对象。这应该优先于从互不相关的不同对象继承功能

关于这一点的主要论点包含在本海报的定义中,并以有趣的方式加以说明:

如果您有一个ToyDuck对象,那么从纯继承的角度来看,您应该从哪个对象继承?你应该继承鸭子的遗产吗?不,很可能你应该继承玩具

底线是您应该为代码使用正确的抽象方法——无论是继承还是组合


对于当前对象,考虑是否有应该从继承树中移除的对象,并将其仅仅包含为可以调用和调用的属性。

< P>我只是略过了文本,但似乎说明了OO设计总是什么:继承不意味着代码重用工具,松耦合是好的。这已经写了几十次了,请参阅文章底部的链接参考资料。这并不意味着您应该完全跳过继承,您只需要简洁地使用它,并且只有在它有意义时才使用它。文章还指出了这一点

至于duck类型,我觉得示例和想法有问题。像这个:

function good (foo) {
  if ( !foo.baz || !foo.quux ) {
    throw new TypeError("We need foo to have baz and quux methods.");
  }
  return foo.baz(foo.quux(10));
}

添加三行新行只是为了报告运行时自动报告的错误有什么意义?

继承不适合代码重用。为代码重用而继承通常会导致:

  • 类具有不能对其调用的继承方法(违反Liskov替换原则),这会混淆程序员并导致错误
  • 深层层次结构,当可以在十几个或更多类中的任意位置声明所需的方法时,需要花费大量时间才能找到该方法
  • 一般来说,继承树的深度不应超过两到三级,通常只应继承接口和抽象基类

    然而,仅仅为了重写现有代码是没有意义的。但是,当您需要修改时,尽可能切换到合成。这通常允许您在较小的片段中修改代码,因为类之间的耦合较少。

    继承是基本的 没有继承,就没有OOP

    原型和委托可以用来实现继承(如JavaScript),这很好,在功能上等同于继承

    对象、消息和组合,但没有继承是基于对象的,而不是面向对象的。VB5,而不是Java。是的,可以做到;计划编写大量样板代码来公开接口和转发操作


    那些坚持认为继承是不必要的,或者说它是“坏的”的人正在创造救命稻草:很容易想象继承被不当使用的场景这不是对工具的反映,而是对工具用户的反映

    我们可以链接到原始文章吗?继承经常被过度使用,但有时实现继承确实非常强大和优雅。没有继承的语言不是OO,句号。