У меня вышеупомянутая модель класса, экспортированная как DLL для пользователей.Учитывая удобство пользователя, им потребуется только создать экземпляр указателя Base и использовать setMode (Mode) для инициализации объекта Tank или Truck.Поскольку им нужен только один танк или грузовик, они также могут использовать setMode (Mode) для повторного использования указателя и инициализации нового танка или грузовика.
Танк может иметь только Canon, у Грузовика может быть только пистолет.
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) производного класса, поэтому я поместил все специальные функции Canon и Gun вбазовый класс как пустая виртуальная функция.
class Weapon{
public:
/*others as usual*/
virtual setColor(String){} //Canon
virtual setBullets(int){} //Gun
}
Но, похоже, это неправильно, Canon не может установитьBullets () и Gun не может установитьColor (), однако нет никаких препятствий для того, чтобы пользователи могли получить объект Canon в указателе оружия.и вызовите функцию setBullets ().
Что было бы более безопасной и правильной моделью класса?