1

我正在寻找完成以下任务的最佳方法:

背景

我有一个带有request()虚拟方法的基础类,不同的子类提供了执行请求的替代实现。我的想法是让客户端实例化这些子类之一并将这些对象之一传递给子系统,该子系统将request()在需要时调用。目标是让客户端决定如何通过实例化所需的子类来处理请求。

问题

但是,如果选择了某个子类实现,则它需要来自子系统的一条信息,该信息最自然地作为参数传递给请求(即request(special_info);)。但其他子类不需要这个。有没有一种干净的方法来隐藏这种差异或可以在这里使用的适当设计模式?

谢谢

4

2 回答 2

0

JB Nizet 的建议是一种可能的解决方案——它肯定会奏效。

让我有点担心的是“有些人需要更多信息”这个相当模糊的概念。这些信息来自哪里,是什么决定的?继承的一般原则是你有一个基类,它为所有对象做正确的事情。如果你不得不说“它是 A 型对象还是 B 型对象,那么就这样做,否则如果它是 C 型对象,则做一些稍微不同的事情,如果是 D 型对象,则做另一种事情”,那么你重新做错了。

可能 JB 的建议对您来说是正确的,但我也会考虑“special_info”可以传递给构造函数,或者通过一些辅助函数获取的选项。构造函数解决方案是一个理智的解决方案,因为在构造时,很明显,您需要知道您正在创建的对象是 A、B、C 还是 D 对象。辅助函数有时是一个很好的解决方案,但如果使用不当,可能会导致解决方案有点混乱,因此请谨慎使用。

通常,当事情以这种方式结束时,这是因为您将班级“错误地”分开。

于 2012-12-26T21:21:13.527 回答
0

使基request()方法将信息作为参数,并忽略不需要的子类实现中的参数。

或者将SubSystem实例本身传递给handler,让handler从SubSystem获取它需要的信息(如果它不需要来自SubSystem的任何信息就忽略它)。这将使设计更具可扩展性:您无需在每次引入需要额外信息的新子类时传递额外的参数并重构所有方法。

于 2012-12-26T21:14:06.773 回答