У меня есть проблема с дизайном, с которой я постоянно сталкиваюсь.
Для иллюстрации предположим, что у меня есть иерархия полиморфных классов.
class A { public: virtual ~A() {} ... };
class B: public A { ... };
class C: public B { ... };
class D: public A { ... };
...
Я хочу иметь возможность печатать экземпляры этих классов полиморфным способом, т.е. каждый класс имеет свой собственный способ печати. Очевидный способ добиться этого - добавить
virtual void print(OutputStream &os) = 0;
в базовый класс и переопределите этот метод в каждом подклассе. Однако, если первоначальная ответственность классов не связана с печатью, это добавит к ним еще одну ответственность, тем самым нарушив SRP.
Мой вопрос: как правильно достичь желаемого поведения без нарушения SRP?
В этом сообщении решение, основанное на Предлагается шаблон оформления посетителей. Однако тогда мне нужно будет создать класс, который должен знать о каждом подклассе A
. Я хотел бы иметь возможность добавлять и удалять подклассы без необходимости всегда изменять посетителя.
Есть ли другой способ сохранения SRP, кроме двух описанных выше?