我正在设计一组小型C ++类,它们都实现了单个接口。我们调用接口IHandler
。它只有一种方法。
有一堆处理程序,我们域中的每种类型都有一个处理程序。我们称之为FooHandler
,BarHandler
等。还有一个PassiveHandler
,它不执行任何操作(这用于不需要处理的域对象)。
所以我们的层次结构看起来很漂亮,像这样:
IHandler
|-PassiveHandler
|-FooHandler
|-BarHandler
| (...)
|-BazHandler
但是,所有处理程序都需要一个数据成员,我们称之为domainObject
,所以我考虑提取一个只保存此对象的公共超类Handler
。
此外,除PassiveHandler
之外的所有处理程序都需要第二个数据成员,我们称之为infoObject
,因此我考虑提取另一个公共超类ActiveHandler
来保存此对象。现在,层次结构看起来更深入,但我们已经删除了一些重复。
IHandler
|-Handler
| |-PassiveHandler
| |-ActiveHandler
| |-FooHandler
| |-BarHandler
| | (...)
| |-BazHandler
您是否会使用浅层设计,其中domainObject
成员声明在所有类中都重复,而infoObject
成员声明在大多数情况下都是如此?或者您更喜欢更复杂的层次结构,删除重复?这些数据成员是否值得?
答案 0 :(得分:3)
我会选择第二种更具层次性的解决方案。不仅因为数据成员,还因为你的评论:“这用于不需要处理的域对象”。这听起来更像是一个零处理程序,它什么都不做。将它从树中拉出来似乎是一件好事,因为您可能也会引入其他功能,这些功能仅适用于“活动处理程序”。
答案 1 :(得分:1)
如何使用抽象类作为基类型而不是纯接口?通过这种方式,您可以拥有共同的祖先,并使domainObject
与所有基类共用。
根据我的经验,在开发的战壕中使用纯OO是不可能实现的。总是必须有一些不太完美的解决方案,但是像这样的情况,你简化继承层次结构是何时弯曲规则的一个很好的例子。
答案 2 :(得分:0)
嗯,你的层次总共有4层不是很深; D
然而,作为一种可能的其他解决方案:您可以为ActiveHandler和PassiveHandler创建2个模板类,它们只从IHandler继承处理程序方法,并使用template参数来保存您想要保存的数据。
我曾经需要这样的东西,最后它非常强大,因为我在某处有一系列这样的处理程序。因此,所有在同一个地方实现的都是超级优雅的,通过编写一个新的帮助程序类作为模板参数,添加一个新的处理程序,它是已存在的处理程序的变体。