我想从stackoverflow社区中寻求这个答案,在我们设计课程时如何决定进行合成或概括。
答案 0 :(得分:2)
问问自己两个班级之间的关系是“a-a”还是“has-a”类型
答案 1 :(得分:2)
如果您的类具有任意数量的其他对象集,则可以使用合成。如果您的类与一组对象共享公共属性,但也可能具有其他不同的属性或行为,请使用泛化。
例如,汽车有发动机,车轮等组件。这是一种组合关系。但是,车辆是汽车的概括,因为您可以拥有其他类型的具有不同属性的车辆,例如卡车。汽车和卡车是车辆的派生类。
答案 2 :(得分:1)
如果我们谈论公共继承(IS_A),关键是要理解Liskov替换原则及其对继承的含义。特别是,它意味着IS-A关系是依赖于上下文的,这是公共继承中经常被忽视的一个方面。
要使用上面的示例,Car and Truck类只应从Vehicle派生,如果它们可以在任何编写的使用Vehicle类的程序中替换Vehicle类而不影响调用代码。
如果我们讨论的是实现继承(也就是C ++中的私有继承),那么你应该优先考虑继承作为重用机制。