Java 继承会增加耦合吗?

Java 继承会增加耦合吗?,java,c++,oop,Java,C++,Oop,我对面向对象编程技术相当陌生,据我所知,耦合是创建可维护、可重用代码的最大障碍 当我们让几个子类从基类继承时,子类不是依赖于基类吗?如果我必须在以后的某个时间点删除基类呢。这不会破坏子类中的代码吗?是的。这被称为: 描述子级与其父级之间的关系 与所有耦合一样,影响一个单元可能会影响依赖它的单元 在这种情况下,删除父类会影响它的所有子类,因为删除父类型时会发生编译器错误 这意味着子类耦合到父类型。父类与其子类之间的关系称为子类依赖关系或实现依赖关系。与其他类型的依赖一样,实现依赖在两个类之间产生一

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


当我们让几个子类从基类继承时,子类不是依赖于基类吗?如果我必须在以后的某个时间点删除基类呢。这不会破坏子类中的代码吗?

是的。这被称为:

描述子级与其父级之间的关系

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

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


这意味着子类耦合到父类型。

父类与其子类之间的关系称为子类依赖关系或实现依赖关系。与其他类型的依赖一样,实现依赖在两个类之间产生一些耦合。请记住,体系结构中类之间的耦合必须最小化

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

程序到接口,而不是实现

然后,如果必须使用继承,最好的方法是使用抽象类作为父类,并让子类只重写抽象方法

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

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


然后,使用黑盒代码重用,即对象压缩,它不会破坏封装并最小化子类耦合。

标准子类型OOP依赖于以下LSP的[总体思路]。因此,是的,更改父类(这样子类就无法保持其先前声明的契约)将破坏子类。然而,这是“耦合”的一个奇怪用法(但我不能说它是不正确的)。也许这仅仅意味着耦合是由实现中的子类型关系假设/暗示的。它肯定会破坏子类中的代码。避免这种情况的一种方法是使用接口,而不是使用超类。但是为什么要删除这么重要的超类呢?@JobinJose FWIW,我很少使用继承(但经常使用接口和DI),除了树型库(例如UI控件)之外,我发现它是一个过度使用的构造。我甚至会说,在Java中,它经常被用作一种包袱,用来掩盖在没有其他优点的情况下重复使用代码的愿望。(我不能说C++用法,但它是一种不同的语言。)@ Jujjice如果继承函数不那么重要,那么在子类中再创建这些函数不是更好吗?@ JojnjoSi不同意“继承在创建一个好的设计中似乎是一个大问题”。你是说不使用继承会导致一个糟糕的设计?你怎么看C,它没有面向对象,但可以说是编程的通用语言……如果继承有这样一个缺点,为什么它在OOP世界里被夸大了?显然,关于OOP的每一篇文章都提到了继承,并将其作为解决许多问题的神奇概念。代码重用是继承的唯一优势吗?@JobinJose在我看来,它实际上并没有被夸大。只有一些语言允许多重继承,关于继承与组合的主题有很多。这只是一个系统,帮助我们实现我们想要的。我可以看出多态性是如何被炒作的,但多态性并不能应用于所有事物。如果您在看到这个“炒作”的地方引用@JobinJose继承有助于减少需要编写的代码行,那么它可能会有所帮助。此外,你所谈论的东西是假设性的。在构造了大量继承超重要超类的子类之后,从代码中删除超重要超类的几率有多大?@Nabeel实际上,继承就是这样被滥用的。您应该始终使用“is-a”或“has-a”概念:
Dog
is-a
Animal
,因此
Dog扩展Animal
。使用继承来最小化代码并不是查看代码的最佳方式。考虑一种对特定类型进行分组的方法,允许您通过实例方法为每个特定类型提供功能,可以覆盖实例方法以允许更具体的类型behavior@VinceEmigh但这就是我要问的,当数百万个类从中继承时,类动物被从程序中删除的几率有多大?