我应该引入一个父类来保存数据成员吗?

时间:2011-07-28 11:15:47

标签: oop

我正在设计一组小型C ++类,它们都实现了单个接口。我们调用接口IHandler。它只有一种方法。

有一堆处理程序,我们域中的每种类型都有一个处理程序。我们称之为FooHandlerBarHandler等。还有一个PassiveHandler,它不执行任何操作(这用于不需要处理的域对象)。

所以我们的层次结构看起来很漂亮,像这样:

IHandler
|-PassiveHandler
|-FooHandler
|-BarHandler
| (...)
|-BazHandler

但是,所有处理程序都需要一个数据成员,我们称之为domainObject,所以我考虑提取一个只保存此对象的公共超类Handler

此外,除PassiveHandler之外的所有处理程序都需要第二个数据成员,我们称之为infoObject,因此我考虑提取另一个公共超类ActiveHandler来保存此对象。现在,层次结构看起来更深入,但我们已经删除了一些重复。

IHandler
|-Handler
| |-PassiveHandler
| |-ActiveHandler
|   |-FooHandler
|   |-BarHandler
|   | (...)
|   |-BazHandler

您是否会使用浅层设计,其中domainObject成员声明在所有类中都重复,而infoObject成员声明在大多数情况下都是如此?或者您更喜欢更复杂的层次结构,删除重复?这些数据成员是否值得?

3 个答案:

答案 0 :(得分:3)

我会选择第二种更具层次性的解决方案。不仅因为数据成员,还因为你的评论:“这用于不需要处理的域对象”。这听起来更像是一个零处理程序,它什么都不做。将它从树中拉出来似乎是一件好事,因为您可能也会引入其他功能,这些功能仅适用于“活动处理程序”。

答案 1 :(得分:1)

如何使用抽象类作为基类型而不是纯接口?通过这种方式,您可以拥有共同的祖先,并使domainObject与所有基类共用。

根据我的经验,在开发的战壕中使用纯OO是不可能实现的。总是必须有一些不太完美的解决方案,但是像这样的情况,你简化继承层次结构是何时弯曲规则的一个很好的例子。

答案 2 :(得分:0)

嗯,你的层次总共有4层不是很深; D

然而,作为一种可能的其他解决方案:您可以为ActiveHandler和PassiveHandler创建2个模板类,它们只从IHandler继承处理程序方法,并使用template参数来保存您想要保存的数据。

我曾经需要这样的东西,最后它非常强大,因为我在某处有一系列这样的处理程序。因此,所有在同一个地方实现的都是超级优雅的,通过编写一个新的帮助程序类作为模板参数,添加一个新的处理程序,它是已存在的处理程序的变体。