【问题标题】:Does inheritance increase coupling?继承会增加耦合吗?
【发布时间】:2015-03-21 19:48:47
【问题描述】:

我对面向对象编程技术相当陌生,据我所知,耦合是创建可维护、可重用代码的最大障碍。

当我们让几个子类继承一个基类时,子类不就依赖于基类了吗?如果我必须在以后删除基类怎么办。这不会破坏子类中的代码吗?

【问题讨论】:

  • 标准子类型 OOP 依赖于遵循 [the general idea of​​] LSP。所以是的,改变父母(这样孩子不能坚持之前声明的合同)会破坏孩子班级。然而,这是一个奇怪的(但我不能说它是不正确的)“耦合”的用法。也许这只是意味着耦合是在实现子类型关系中假定/暗示的..
  • 它肯定会破坏子类中的代码。避免这种情况的一种方法是使用接口而不是使用超类。但是你为什么要删除这么重要的超类呢?
  • @JobinJose FWIW,我很少使用继承(但使用接口和 DI 很多),除了树状库(例如 UI 控件、例如)发现它是一个过度使用的结构。我什至会争辩说,在 Java 中,它经常被用作对重用代码的渴望而没有其他优点的绷带。 (我不能说 C++ 的用法,但它是一种不同的语言。)
  • @JobinJose 如果继承的函数不那么重要,在子类中再次创建这些函数不是更好吗?
  • @JobinJose 我不同意“继承似乎对创建一个好的设计很重要”你是说不使用继承会导致一个糟糕的设计?您如何看待 C,它没有面向对象,但可以说是编程的通用语言......

标签: java c++ oop


【解决方案1】:

是的。这被称为Subclass Coupling

描述孩子与其父母之间的关系。

像所有耦合一样,影响一个单元可能会影响依赖它的单元。

在这种情况下,删除父类会影响所有它的子类,因为在删除超类型时会发生编译器错误。

这意味着子类与超类耦合。

【讨论】:

  • 如果继承有这样的缺点,为什么它在 OOP 世界中被夸大了?显然,关于 OOP 的每篇文章都确实在某处提到了继承,并将其作为解决许多问题的神奇概念。代码重用是继承的唯一优势吗?
  • @JobinJose 实际上并没有被过度炒作,据我所见。只有一些语言允许多重继承,并且有很多关于继承与组合的主题。它只是一个帮助我们实现我们想要的东西的系统。我可以看到多态性是如何被炒作的,但多态性不能应用于所有事物。如果您引用了您在哪里看到这种“炒作”,这可能会有所帮助
  • @JobinJose 继承有助于减少需要编写的代码行数。此外,您所说的内容是假设性的。在构造了许多继承自它的子类之后,必须从代码中删除一个超级重要的超类的可能性有多大?
  • @Nabeel 实际上,这就是继承可以被滥用的方式。您应该始终使用“is-a”或“has-a”概念:Dog is-a Animal,所以Dog extends Animal。使用继承来最小化代码并不是查看代码的最佳方式。考虑一种对特定类型进行分组的方法,允许您通过实例方法为每个特定类型提供功能,可以重写以允许更具体的行为
  • @VinceEmigh 但这就是我要问的问题,当数百万个类继承自程序时,从程序中删除类动物的几率是多少?
【解决方案2】:

父类与其子类之间的关系称为子类依赖实现依赖。与其他类型的依赖一样,实现依赖会在两个类之间产生一些耦合。请记住,必须尽量减少架构中类之间的耦合。

正如设计模式一书中所述,减少这种耦合的唯一方法是使用以下原则:

编程到接口,而不是实现。

那么,如果你必须使用继承,最好的方法是使用抽象类作为父类,让子类只覆盖抽象方法。

在具体类之间使用继承也称为白盒代码重用

父类通常至少定义其子类的部分物理表示。因为继承将子类暴露给其父类的实现细节,所以人们常说“继承破坏了封装”。

然后,使用黑盒代码重用,也就是对象组合,它不会破坏封装并最大限度地减少子类化耦合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多