旧的但明智的说法是“价值构成优于继承”。我一直在努力将这个以及其他OOP和设计模式应用到我参与的最后几个项目中。
对于大多数情况,它运作良好,看起来很正确。但是我注意到有些时候,只有2或3个班级真正发挥出最大的作用,而其他10个班级突然变成了一种简单的委托者,其细节变化很小。
有时候,我尝试通过使用一个抽象类来解决这个问题,这个抽象类具有不同的细节,将不同的细节委托给具体的实现,但有些事情并不完全正确。
你如何保持平衡并同时遵循旧的明智的说法?我做错了吗?
答案 0 :(得分:3)
我认为你的问题可能是你试图遵循“老聪明的说法”。您可能比任何通用指南更了解应用程序的要求。
一旦你积累了构建应用程序的经验,你应该对如何做事情有一种自然的感觉。指南就是这样,指南可以帮助您理解一个概念。它们本身不是规则。
答案 1 :(得分:2)
“继承的价值构成”是一句老话,即使在今天也是有效的。 组成和继承意味着增加可重复使用的&减少重复的代码。继承还有其他好处。
组合意味着如果您具有属于2个或更多类层次结构的泛型方法,则将其分离为新类,并让类层次结构将此新类作为组合的一部分。有了这个,您还没有触及类层次结构,您可以获得可重用代码的好处。
class Aves { ... }
class Hawk: Aves { ... }
class Mammal { ... }
class Bat: Mammal { ... }
在上面的例子中,所有Aves(鸟类)Fly(),(像Penguin或Dodo这样的不会飞的鸟类仍然可以实现没有苍蝇的苍蝇())。 但是作为哺乳动物的蝙蝠也可以飞()
你现在可以将Fly()作为一个单独的类拉出来,并使组合优于继承(包括作为Aves的一部分的Fly())
class FlyBehavior
{
public void Fly() { ... }
}
FlyBehavior可以是具有ShortFlightBehavior和LongFlightBehavior的类层次结构。
我希望我没有进一步困惑你。)
答案 2 :(得分:1)
何时停止?根本不要专注于作文。如果你专注于其他规则,它会很自然。
专注于“is-a”和SRP来获得适当的继承。
检查SRP类的最简单方法是尝试将每个方法名称与类名相关联。
class Vehicle
{
private void WriteLog(string message) {}
public void Start();
}
WriteLog
方法实际上无法与Vehicle
相关联。将其分解并通过构造函数(构造和依赖注入)接受它。
答案 3 :(得分:0)
听起来你正在将启发式智慧转变为绝对智慧。它并没有告诉你“从不”使用继承。如果您处于继承或组合同样良好的情况下,则使用组合。简单。