![]() |
1
30
我相信,使用设计模式开发的越多,您会越来越频繁地发现组合将比继承更受欢迎。我真的相信 头部优先:设计模式 书中写道: 有利于组合而非继承 “是主要设计原则之一。 您能够模拟组成部分进行测试的示例可能是最好的示例之一。 编辑 :尽管设计模式的基本原则是赞成组合而不是继承,但这并不意味着没有设计模式在需要继承的地方使用继承。另一个基本的例子是decorator模式,您在这里编码一个抽象的超类(尽管这是为了类型匹配,而不是为了实现一个“is-a”关系)。 |
![]() |
2
10
这不是一个非此即彼的局面。他们不是竞争对手。 继承也相当容易进行单元测试。然而,有时需要模拟具体类来测试抽象超类。 继承很容易被不当使用。有些设计看起来像是“IS-A”情况,但实际上并不是——它们更细微。有时它真的“表现得像”你需要某种组合(A 策略 例如)将行为与其他属性分开。 |
![]() |
3
8
四人帮 Design Patterns 这本书基本上都是关于为什么喜欢构图而不是继承,并提供了很多方法来做到这一点。原因有:
|
![]() |
4
5
我认为组合更容易测试的最大原因是(实现)继承倾向于创建非常耦合的类,这些类更脆弱(脆弱的基类)并且更难单独测试。 继承当然有它的用途,但我发现自己越来越喜欢组合而不是继承。 |
![]() |
5
3
“优先使用对象组合而不是类继承” 实际上是从Gof的书。这个 conversation 埃里希·伽玛在书中描述了这个想法。 需要继承的一个重要模式是模板方法模式。这种模式被广泛使用非常方便,所以继承就留在这里。另一个使用继承的常见模式是复合模式。我试图说明的一点是,根本不考虑继承,但我希望从任何角度看这么多常见的API都能清楚… |
![]() |
Jivan · 使用mypy在Python中强制合成 2 年前 |
![]() |
woockashek · Java中同一类的继承和组合 7 年前 |
![]() |
Sepehr Sobhani · 函数Ramda在范围外传递函数参数 7 年前 |
![]() |
M. Pilarczyk · 如何确保合成方法的安全? 8 年前 |
![]() |
daign · 在JavaScript中混合作为对象本身的对象属性 9 年前 |
![]() |
arjacsoh · 当不允许多重继承时,如何避免代码重复? 10 年前 |