2011-04-19 49 views
8

有古老但明智的说法:“超越继承的价值构成”。我一直试图将这一点与其他OOP和设计模式一起应用于我参与的最后几个项目。作文,你怎么知道何时停止?

对于大多数情况,它工作得很好,看起来有点像对。但我注意到有些时候,只有2到3个班级真正发挥出最好的效果,而其他10多个班级突然间变成了一些简单的委托人,只是细微的变化。

有时,我试图通过使用具有不同变化细节的抽象类来解决这个问题,但是有些东西并不完全正确。

你如何保持平衡并遵循旧的智慧说法?难道我做错了什么?

回答

3

我认为你的问题可能是你试图遵循“老明智的说法”。您可能比任何通用指南更了解应用程序的要求。

一旦你积累了一些建立应用程序的经验,你应该对如何做事情有一种自然的感觉。指南就是这样的指南,可以帮助你理解一个概念。它们本身不是规则。

2

“继承价值构成”是一个古老的说法,即使在今天也是如此。 组合和继承旨在增加可重复使用的&以减少重复代码。继承也有其他好处。

组合意味着如果您具有属于2个或更多类的层次结构的泛型方法,请将其作为新类分离出来,并让类层次结构将此新类作为组合的一部分。有了这个,你不会触及类层次结构,你可以获得可重用代码的好处。

class Aves { ... } 
class Hawk: Aves { ... } 

class Mammal { ... } 
class Bat: Mammal { ... } 

在上面的例子中,所有的鸟类(鸟类)飞(),(不会飞的鸟像企鹅或突突仍然可以实现飞(),没有飞)。 但蝙蝠是哺乳动物也能飞()

您现在可以拉出飞()作为一个单独的类和青睐组成了继承(包括飞()作为鸟类的一部分)

class FlyBehavior 
{ 
public void Fly() { ... } 
} 

例如,FlyBehavior可以是一个带有ShortFlightBehavior和LongFlightBehavior的类层次结构。

我希望我没有让你感到困惑进一步:)

0

这听起来像你正在改变启发智慧为绝对。它并没有告诉你“永不”使用继承。如果您处于继承或组合工作同样良好的情况,请使用组合。简单。

1

何时停止?完全停止专注于作文。如果你专注于其他规则,它会自然而然地发生。

专注于“is-a”和SRP来获得适当的继承。

检查SRP类最容易的方法是尝试将每个方法名称关联到类名称。

class Vehicle 
{ 
    private void WriteLog(string message) {} 
    public void Start(); 
} 

WriteLog方法不能真正与Vehicle关联。打破它,并通过构造函数(组合和依赖注入)。

+0

有趣。那么,在这种情况下,您会将'Log'对象传递给Vehicle的构造函数?你怎么援引这个?您仍然需要'WriteLog()'方法,然后调用'Log'对象的'Write()'方法。是对的吗? – Martijn 2011-04-19 11:30:41

+1

请注意'WriteLog'方法是私有的。把它作为“公共”会变得更糟。所以在内部使用它并不是一个真正的问题。只是使用该领域。 – jgauffin 2011-04-19 11:34:58

+0

没有注意到该方法是私人的。我的错。感谢您的解释,但。 – Martijn 2011-04-19 11:38:52

相关问题