Имам проблем с дизайна, с който постоянно се сблъсквам.
За илюстрация, нека приемем, че имам полиморфна класова йерархия
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, освен двата начина, описани по-горе?