Как “победить” инкапсуляцию

130
24 апреля 2019, 02:20

Обычный пример с юнитом.

class Unit {
private:
    int health;
public:
    Unit(int health);
    virtual ~Unit();
protected:
    virtual void setHealth(int newHealth);

далее делаем наследника

class Healer : public Unit {
public:
    Healer(int health);
    virtual void healing(Unit* other);
};

В реализации лечения:

void Healer::healing(Unit* other) {
    other->setHealth(100);
}

И вот инкапсуляция не разрешает так делать. other->setHealth(100);

'setHealth' is a protected member of 'Unit' other->setHealth(newHealth);

can only access this member on an object of type 'Healer' virtual void setHealth(int newHealth);

При этом для this вызвать этот метод можно.

Answer 1

Мне, кажется, надо добавить вам интерфейс типа IHealable например. И, далее, действовать через него. Например сделать ещё один класс HealableUnit: Unit, IHealable и в методе healing работать с интерфейсом, а не с методом.

READ ALSO
Как индексировать сохраняемый файл Qimage

Как индексировать сохраняемый файл Qimage

Я нарезаю картинку в цикле и сохраняю ее таким способом

182
Как передать значение из реестра

Как передать значение из реестра

У меня есть виджет строкового поляКак сделать, чтобы сохранялся текст этой строки и передавался в реестр, чтобы потом можно было загрузить...

164
Как узнать, что окно открыто?

Как узнать, что окно открыто?

Какой метод отвечает за проверку открытия окна?

153
Как исправить кодировку при чтении .properties файла?

Как исправить кодировку при чтении .properties файла?

Есть класс который подтягиват данные из файла css-selectorproperties, но кириллические символы лоомаются превращаясь в иероглифы

157