我将上述类模型作为DLL导出到用户。考虑到用户的方便,他们只需要实例化一个Base指针,并使用setMode(Mode)来初始化Tank或Truck对象。由于他们随时只需要一辆坦克或卡车,因此他们也可以使用setMode(Mode)重用指针并初始化新的坦克或卡车。
坦克只能有佳能,卡车只能有枪。
setMode(Mode)将分别初始化车辆类别中的武器。 setMode(Mode)看起来像这样(请暂时忽略指针内存问题):
void Vehicle::setMode(Mode mode){
this->mode = mode;
if(mode == Tank){
weapon = new Canon("owner");
}else{
weapon = new Gun("owner");
}
}
我的目的是为了简化用户,他们只需要了解Vehicle和Weapon基本类,以便他们使用Base Vehicle类并调用getWeapon(Weapon *)获得Base Weapon类,并加载武器并将其放回车辆。像这样:
//In case of Tank
Vehicle *vehicle = new Vehicle;
vehicle->setMode(Mode::Tank);
Weapon *weapon = vehicle->getWeapon();
weapon->setColor("red"); //Canon only function
weapon->reload();
vehicle->setWeapon(weapon);
vehicle->fire();
但是,正如您所见,因为它是基指针,所以它不能调用派生类的setColor(String)函数,因此我将所有佳能和Gun特定的函数作为空虚函数放在基类中。
class Weapon{
public:
/*others as usual*/
virtual setColor(String){} //Canon
virtual setBullets(int){} //Gun
}
但这似乎是错误的,佳能无法setBullets()和Gun无法setColor(),但是并不能阻止用户在武器指针中获取佳能对象并调用setBullets()函数。
什么是更安全,更合适的课堂模型?