【发布时间】:2013-07-25 06:29:13
【问题描述】:
我有一个经常遇到的设计问题。
为了便于说明,假设我有一个多态的类层次结构
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 的情况下实现所需行为的正确方法是什么?
在this post中,提出了基于Visitor design pattern的解决方案。但是,然后我需要创建一个必须知道A 的每个子类的类。我希望能够添加和删除子类,而无需总是修改访问者。
除了上述两种方法之外,还有其他一些保留 SRP 的方法吗?
【问题讨论】:
-
你的 print() 方法是做什么的?它的输出是否包含有关类内部的任何信息?在这种情况下,我会将它的定义放入类中,因为唯一的另一种选择是打破封装,而且更不灵活。我知道的所有其他解决方案都与在 C++ 中实现函数参数的动态分派有关,这可能很难看。
-
@Markus Mayr:假设发出的信息可以从每个子类的公共接口获取,但不一定只使用基类接口。否则,正如您已经提到的,封装将需要被打破。
标签: c++ polymorphism single-responsibility-principle