考虑一个称为Vehicle的抽象类。该车辆具有以下抽象操作
-开始
-休息
-加速
class Vehicle
{
public:
virtual void Start() = 0;
virtual void Break() = 0;
virtual void Accelerate() = 0;
};
现在考虑我们有一个特殊的车辆类型,即VehicleA。
Class VehicleA: public Vehicle
{
private:
double speed;
double temperature;
int id;
double miles;
public:
void Start();
void Break();
void Accelerate();
void horn();
};
如果我现在拥有的车辆几乎与VehicleA类型相似,但说的是发动机类型或其他一些特性(例如颜色)则略有不同,这是适应类层次结构设计中如此小的更改的最佳方法。我是不是该
谢谢
最佳答案
在这种情况下,您确实应该考虑组合而不是继承。
根据类Vehicle
的实际含义(要小心一点,在进行此类设计时,直觉不一定是最好的 friend :考虑一下著名的Square/Rectangle情况),您可以让VehicleA声明以下内容方式(不要忘记虚拟关键字):
class VehicleA: public Vehicle
{
private:
//Your specific private
Engine* m_engine;
Color* m_color;
//Add any "modifiable" part as long as it fits
public:
virtual void Start();
virtual void Break();
virtual void Accelerate();
void horn();
};
与
Engine
和Color
两个类(可以是抽象的)可以保存要实现的细节。您添加了另一个抽象层次:
VehicleA
具有引擎(具有其自己的界面),但是不必关心其细节(只要引擎具有车辆可以与之交互的界面),就可以轻松添加一种新型的发动机。作为设计层次结构的一般规则,如果您认为必须实现特定类的新派生类,请询问以下内容:
此类是否是其父类的更特定版本?
在您的情况下,感觉VehicleB不会是VehicleA的更特定版本,尽管这仍然是一个意见问题,因为它完全取决于您要执行的操作。在这种情况下,感觉应该是合成。
关于c++ - 类(class)设计,差异不大,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16943937/