有古老但明智的说法:“超越继承的价值构成”。我一直试图将这一点与其他OOP和设计模式一起应用于我参与的最后几个项目。作文,你怎么知道何时停止?
对于大多数情况,它工作得很好,看起来有点像对。但我注意到有些时候,只有2到3个班级真正发挥出最好的效果,而其他10多个班级突然间变成了一些简单的委托人,只是细微的变化。
有时,我试图通过使用具有不同变化细节的抽象类来解决这个问题,但是有些东西并不完全正确。
你如何保持平衡并遵循旧的智慧说法?难道我做错了什么?
有古老但明智的说法:“超越继承的价值构成”。我一直试图将这一点与其他OOP和设计模式一起应用于我参与的最后几个项目。作文,你怎么知道何时停止?
对于大多数情况,它工作得很好,看起来有点像对。但我注意到有些时候,只有2到3个班级真正发挥出最好的效果,而其他10多个班级突然间变成了一些简单的委托人,只是细微的变化。
有时,我试图通过使用具有不同变化细节的抽象类来解决这个问题,但是有些东西并不完全正确。
你如何保持平衡并遵循旧的智慧说法?难道我做错了什么?
我认为你的问题可能是你试图遵循“老明智的说法”。您可能比任何通用指南更了解应用程序的要求。
一旦你积累了一些建立应用程序的经验,你应该对如何做事情有一种自然的感觉。指南就是这样的指南,可以帮助你理解一个概念。它们本身不是规则。
“继承价值构成”是一个古老的说法,即使在今天也是如此。 组合和继承旨在增加可重复使用的&以减少重复代码。继承也有其他好处。
组合意味着如果您具有属于2个或更多类的层次结构的泛型方法,请将其作为新类分离出来,并让类层次结构将此新类作为组合的一部分。有了这个,你不会触及类层次结构,你可以获得可重用代码的好处。
class Aves { ... }
class Hawk: Aves { ... }
class Mammal { ... }
class Bat: Mammal { ... }
在上面的例子中,所有的鸟类(鸟类)飞(),(不会飞的鸟像企鹅或突突仍然可以实现飞(),没有飞)。 但蝙蝠是哺乳动物也能飞()
您现在可以拉出飞()作为一个单独的类和青睐组成了继承(包括飞()作为鸟类的一部分)
class FlyBehavior
{
public void Fly() { ... }
}
例如,FlyBehavior可以是一个带有ShortFlightBehavior和LongFlightBehavior的类层次结构。
我希望我没有让你感到困惑进一步:)
这听起来像你正在改变启发智慧为绝对。它并没有告诉你“永不”使用继承。如果您处于继承或组合工作同样良好的情况,请使用组合。简单。
何时停止?完全停止专注于作文。如果你专注于其他规则,它会自然而然地发生。
专注于“is-a”和SRP来获得适当的继承。
检查SRP类最容易的方法是尝试将每个方法名称关联到类名称。
class Vehicle
{
private void WriteLog(string message) {}
public void Start();
}
的WriteLog
方法不能真正与Vehicle
关联。打破它,并通过构造函数(组合和依赖注入)。
有趣。那么,在这种情况下,您会将'Log'对象传递给Vehicle的构造函数?你怎么援引这个?您仍然需要'WriteLog()'方法,然后调用'Log'对象的'Write()'方法。是对的吗? – Martijn 2011-04-19 11:30:41
请注意'WriteLog'方法是私有的。把它作为“公共”会变得更糟。所以在内部使用它并不是一个真正的问题。只是使用该领域。 – jgauffin 2011-04-19 11:34:58
没有注意到该方法是私人的。我的错。感谢您的解释,但。 – Martijn 2011-04-19 11:38:52