关于继承的一些困惑

Some confusion regarding inheritance

提问人:I Love Stackoverflow 提问时间:6/25/2019 最后编辑:I Love Stackoverflow 更新时间:6/26/2019 访问量:94

问:

我正在读一本书,我不明白以下 3 个关于继承的问题:

1 ) 首先,您不能在运行时更改从父类继承的实现,因为继承是在编译时定义的。

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

3)子类的实现与其父类的实现紧密相连,以至于父类实现中的任何更改都将迫使子类更改。

以上所有要点都是在没有任何代码片段的情况下提及的,所以我在理解以上 3 点时遇到了问题。

如果有人能通过代码示例帮助我理解上述 3 点,以及每个点在代码中的影响和位置,我将不胜感激。

OOP 继承与 语言无关

评论

0赞 Kokodoko 6/25/2019
Stackoverflow 用于代码问题,所以也许您可以通过一些简单的编码实验来尝试自己的示例?你甚至可能通过做来得到一些答案。
1赞 I Love Stackoverflow 6/25/2019
@Kokodoko我有点不同意,因为有很多关于这样的问题。例如,这个怎么样(stackoverflow.com/questions/6308178/...)
0赞 Wim Coenen 6/25/2019
这是哪本书的出自?
0赞 I Love Stackoverflow 6/25/2019
@WimCoenen它来自:设计模式,可重用面向对象软件的元素。它以pdf的形式在线提供
1赞 I Love Stackoverflow 6/25/2019
@Kokodoko 我真的很感谢你的提示,但在这种情况下,我真的不明白这 3 点来编写一些代码,这就是我在这里问的原因

答:

0赞 progmatico 6/26/2019 #1

1 ) 首先,您不能更改从父级继承的实现 类,因为继承是在编译时定义的。

这意味着两个类之间的继承关系是在您编写的代码中建立的,并且在编译后,当代码执行时,这是无法更改的。

2)其次,通常更糟糕的是,父类通常至少定义 其子类的物理表示的一部分。因为继承 将子类暴露给其父类实现的细节,它是 常说的“继承打破了封装”。

如果你对某个父类进行子类化,你通常意味着该子类也像父类一样,有一些扩展和/或覆盖差异。某些属性或行为很常见,您可以访问这些属性或行为。两者之间存在一定程度的知识共享,您可以将其视为信息泄露。如果要不惜一切代价保留封装,你就是在破坏它(但有充分的理由)。如果不是这样,继承就没用了。

3)子类的实现与 其父类的实现,即父类的任何更改 实现将强制更改子类。

我没有这三个子句的上下文,但是是的,它们必须在一定程度上耦合,父类的变化对子类的影响有多大取决于具体情况。