在设计对象及其关系时如何在组合和泛化之间做出决定?

时间:2009-03-02 11:59:39

标签: oop class-design

我想从stackoverflow社区中寻求这个答案,在我们设计课程时如何决定进行合成或概括。

3 个答案:

答案 0 :(得分:2)

问问自己两个班级之间的关系是“a-a”还是“has-a”类型

答案 1 :(得分:2)

如果您的类具有任意数量的其他对象集,则可以使用合成。如果您的类与一组对象共享公共属性,但也可能具有其他不同的属性或行为,请使用泛化。

例如,汽车有发动机,车轮等组件。这是一种组合关系。但是,车辆是汽车的概括,因为您可以拥有其他类型的具有不同属性的车辆,例如卡车。汽车和卡车是车辆的派生类。

答案 2 :(得分:1)

如果我们谈论公共继承(IS_A),关键是要理解Liskov替换原则及其对继承的含义。特别是,它意味着IS-A关系是依赖于上下文的,这是公共继承中经常被忽视的一个方面。

要使用上面的示例,Car and Truck类只应从Vehicle派生,如果它们可以在任何编写的使用Vehicle类的程序中替换Vehicle类而不影响调用代码。

如果我们讨论的是实现继承(也就是C ++中的私有继承),那么你应该优先考虑继承作为重用机制。