Какова лучшая иерархия наследования для этой модели в C ++? - PullRequest
1 голос
/ 05 марта 2019

enter image description here У меня вышеупомянутая модель класса, экспортированная как 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 ().

Что было бы более безопасной и правильной моделью класса?

...