class A : public Interface
{
public:
void doAction();
void interfaceMethod1();
...
}
class AExt
{
public:
void doAction();
private:
int m_state;
}
У меня есть класс A, который может делать Action(), а также реализацию интерфейса (интерфейс не включает doAction). Работа прекрасна, поэтому я хотел бы свести к минимуму изменения в A. Теперь я хочу добавить новое состояние и создать класс AExt, который теперь берет на себя ответственность за создание doAction(), который изменяет состояние и теперь зависит от состояния. Цель состоит в том, чтобы ограничить doAction() так, что он может быть вызван ТОЛЬКО с помощью AExt, потому что вызов A :: doAction не из AExt нарушит функциональность. В то же время Aext использует только публичный интерфейс А.Метод ограничения доступа к определенному классу
- я могу сделать DoAction() частный и сделать Aext друг A, но мне не нравится это, потому что он выставит внутренности всех А к Aext;
- Я могу сделать doAction() виртуальным и наследовать AExt от A, той же проблемой. Кроме того, будет (probabaly) быть преемником, который не хочет знать, есть ли A или AExt.
- Я могу использовать тот же интерфейс для A и AExt и использовать шаблон Decorator, но мне это не нравится, потому что у A есть много дополнительных методов (весь интерфейс), которые AExt не нужен, и им нужны клиенты A.
Я могу использовать состав следующим образом: , но это не помешает вызову A :: doAction() извне.
class AExt { public: void doAction() { m_a.doAction(); ... } A& getA() { return m_a; } }
предложения?
Взгляните на модификатор доступа 'protected' – DrYap