Inheritance 应用程序体系结构中具体继承的主要竞争设计模式是什么?

Inheritance 应用程序体系结构中具体继承的主要竞争设计模式是什么?,inheritance,composition,Inheritance,Composition,偶尔我会看到关于企业应用程序体系结构中继承“过时”的评论,但我没有看到一篇描述竞争理论的文章的链接。另外,如果应用程序已经构建,与从头开始相比,在实现上是否存在差异?我想这可能与严重依赖接口有关,但我不确定。我想你指的是设计原则: “赞成和解胜于和解 继承权。” 这与其说是一个架构问题,不如说是一个本质类设计问题。实现继承有两个方面的困难:继承关系的静态性质和继承关系的静态性质 在这种情况下,典型的替代方法是使用组合的接口实现:新对象包含对它所包装的较低级别对象的引用,并转发对它的调用,其中一些

偶尔我会看到关于企业应用程序体系结构中继承“过时”的评论,但我没有看到一篇描述竞争理论的文章的链接。另外,如果应用程序已经构建,与从头开始相比,在实现上是否存在差异?我想这可能与严重依赖接口有关,但我不确定。

我想你指的是设计原则:

“赞成和解胜于和解 继承权。”


这与其说是一个架构问题,不如说是一个本质类设计问题。实现继承有两个方面的困难:继承关系的静态性质和继承关系的静态性质


在这种情况下,典型的替代方法是使用组合的接口实现:新对象包含对它所包装的较低级别对象的引用,并转发对它的调用,其中一些调用可能被包装或直接替换。单个包装器类可以让其实例包装不同的底层服务实现,而且包装器不太可能被脆弱的基类问题破坏,因为它无法访问受保护的成员。

继承的一种非常流行的替代方法(如子类化)是对象组合和委托

所以不是

 public class B extends A implements I {
    // now I have all the methods from A
 }
是吗

public class B implements I {
     private I a;

     // delegate all methods
     public void methodOne(){
          a.methodOne();
     }
}
组合比子类化更灵活:

  • 您可以有多个委托(而不是只有一个超类,至少在Java中是这样)
  • 它清晰地将接口和实现分开(而对于超类,您可以同时获得它的方法和它们的实现,甚至是不在接口中的方法)
  • 您可以在运行时通过配置交换委托(而超类实例是在中编译的)。依赖注入建立在这个基础上

    • Smalltalk和Perl中也有一些特性和角色。它们允许您重用功能。看看这个。

      Allen Holub描述了如何实现接口优于子类化。虽然这是2003年写的,但它仍然是一个主题。有趣的是,2009年有很多评论

      继承不是一种风格 它是一种工具

      作文也是如此

      每当我读到这样一封毛毯状的信时,我就想:

      菲利普斯螺丝比平头螺丝好。 当你需要钉子或焊缝时,两者都不好,当你知道自己在做什么时,两者中的一个或两个都好


      两者之间的区别是明显而简单的——“是-a”与“有-a”——虽然构图可以用来模拟继承(需要大量额外的工作),但反过来通常并不正确。这不是反对继承的论点,也不是支持组合的论点

      模型的语义远比用来表示它的机制重要。如果说“爬行动物有一种动物,并利用授权暴露其方法和特性”,而不是“爬行动物是一种动物”,那将是愚蠢的,不是吗?那么,为什么不必要地对一个对象做同样的事情不那么愚蠢呢

      继承非常有用,是面向对象编程的基础。直到更好的东西出现,它才会消失,我还没有发表;-)


      (让火焰开始)

      < p>如果你使用C++,那么你应该认真考虑使用MIXIN(注意:一些其他语言声称支持某种形式的混合):

      更有趣的是“奇怪的重复模板模式”(CRTP):

      我认为CRTP是一个非常有用的mixin应用程序

      一旦你“明白了”(这需要一段时间),你就会意识到混合是非常完美的。它们为您提供了一种代码重用方法,这种方法不存在通过继承进行重用的问题,但比使用组合和委托更灵活、更高效

      有趣的是,CRTP允许您模拟虚拟函数调用,消除了实际虚拟函数调用的开销(在时间和空间上),而实际虚拟函数调用并不特别需要这种语言特性。删除虚拟函数调用可以使编译器提供更好的优化,从而提高性能

      福利的清单就这么一个接一个。。。在缺点方面,C++中语法上很难看,但你要学会用它来生活。使用宏来形成mixin链可以使代码更具可读性


      在我看来,mixin是可重用的代码片段,可用于构建类。通常,它们帮助您实现接口,提供方法的通用实现。你最终会觉得你可以“去买”组成你的课程的部分,而几乎没有什么“管道”可以让这些部分一起工作。

      我一直喜欢艾伦·霍卢布的态度。虽然他可能很极端,但我不得不说,遵循他的建议极大地改进了我自己的代码。我也发现他的建议很有帮助。然而,他的笼统陈述和概括可能令人困惑。我认为,重要的是要设法弄清他的意思,而不是逐字逐句地解释他所写的内容。“虽然构图可以用来模拟继承(需要大量额外工作)”:这是非常少的额外工作,可以用工具来处理。与生成getter/setter的情况相同。有些语言有一个delegate关键字,这使得composition成为一个一流的语言构造,就像子类化的“extends”关键字一样。当然,它不能使其与“上游”变化保持同步。但这相当于更改接口定义。重构工具的支持可能会达到同样的水平(不确定现在是否有)。“继承是基础,组合是门面”。这只是一个语言设计的决定。他们可以得到同样的地位。我不认为继承权是最重要的
      Wikipedia: http://en.wikipedia.org/wiki/Mixin
      Dr. Dobbs: http://www.ddj.com/cpp/184404445.
      
      Wikipedia: http://en.wikipedia.org/wiki/Curiously_Recurring_Template_Pattern.