繁体   English   中英

需要了解“对抽象类的更改不会破坏所有继承类的代码”

[英]Need understanding on “Changes in abstract class will not break code for all inheriting classes”

  1. 请提供您对以下语句中所引用内容的见解或纠正我的观点:“当我们在抽象类中更改代码时,所有继承类都将发生此更改。但是在Interface中更改代码时,它将破坏所有实现类的代码”

当我尝试如下时,它们(抽象类和接口)都破坏了代码。

我尝试使用方法1(具体),方法2(抽象)创建抽象类A,并创建了扩展类A的类B。 当我尝试在类A中添加另一个方法3(抽象)时,我看到类B中的代码中断(错误-必须实现继承的抽象方法)。

  1. 具有“仅抽象类中的抽象方法”和“仅抽象类中的具体方法”的主要目标是什么?

1-它们表示不同类型的更改:当他们说“所有继承的类都将具有此更改”时,他们必须谈论的是不间断的更改,例如更改方法的实现,添加字段,编写其他私有的非抽象方法, 等等。 某些更改可能会中断,例如编写非私有方法,因为现有的类可能具有相同名称的方法,但是返回的是不同的东西,或实现了不同的功能。

另一方面,接口由方法声明组成,因此对它们的大多数更改都将是中断的(某些更改是不中断的,例如,在接口中重命名方法的形式参数)。

在Java-8中,您还可以提供方法的默认实现。 更改默认实现是一项不间断的更改-代码将继续编译。

2-仅具有抽象方法且没有数据成员的抽象类没有合法目的。 与接口相比,它降低了使用该接口的代码的灵活性,因为子类无法继承任何其他类。

  1. 对于第一个问题

甚至我不确定这行到底是什么意思,但这是我对此的解释。 抽象类既可以具有抽象方法,也可以具有具体方法,第一条语句指的是添加新的具体方法或更改现有具体方法的参数,这些更改将反映在所有继承的类中。

默认情况下,接口中的所有方法都是抽象的,并且要求每个实现类都应定义接口的每个方法或使其抽象。 现在,在第二条语句中,通过破坏代码表示这意味着,如果我们对接口方法进行更改,则应该对实现方法也进行相应的更改。 在界面中更改方法的参数

  1. 对于第二个问题,

    • “只有抽象类中的抽象方法”->我找不到找到这样做的正当理由,因为具有所有抽象方法的抽象类几乎没有用,而接口会更灵活。

    • “仅抽象类中的具体方法”->这样做的一个原因是,如果您尝试实现类似“模板方法设计模式”的方法。 您可以在它周围搜索并获取详细信息。 另一个原因可能是避免直接实例化它(我坚信不应这样做:p)。

我希望这有帮助....

需要了解“对抽象类的更改不会破坏所有继承类的代码”

没有二分法。

通过Java中的继承,子类(或实现类)至少会得到两件事:

  • 合同(由其API指定)
  • 实现(以前仅适用于抽象类,但现在也可用作Java 8+中的默认接口方法)

它通常是真的,一个API开发人员可以自由改变由一个抽象类提供只要这种变化不会改变其API规定的合同执行。 如果发生这种情况,那么可以,更改实现将导致客户端中断。

但是,API开发人员绝对不能更改合同(无论是由抽象类还是由接口指定的合同),并且不要指望客户端中断。 在Java 7和更早的版本中,接口只能使用抽象方法签名来表达契约……因此更改其中任何一个都会破坏客户端。

即便如此,即使在Java 7中,抽象类作者也可以开发方法实现而不会付出任何代价(甚至添加新方法),但前提是抽象类指定的原始协定仍然有效。

  1. 如果协定中有很多方法,那么抽象类会更有用,因为我们可以为所有子类共有的某些方法提供默认实现。 同样,如果子类不需要实现特定的方法,则可以避免提供实现,但是在使用接口的情况下,子类将必须为所有方法提供实现,即使它没有用处也没有实现。只是空块。

  2. 如果我们的基本合同一直在变化,那么接口会引起问题,因为在不更改所有实现类的情况下我们无法向接口声明其他方法,使用抽象类,我们可以提供默认实现,而仅更改实际使用的实现类使用新方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM