我正在寻找实现以下目标的最佳方法:
背景
我有一个带有request()
虚拟方法的基类,不同的子类提供执行请求的替代实现。我的想法是让客户端实例化其中一个子类,并将其中一个对象传递给子系统,该子系统将在需要时调用request()
。目标是让客户端通过实例化所需的子类来决定如何处理请求。
问题
但是,如果选择了某个子类实现,它需要来自子系统的一条信息,这些信息最自然地作为请求的参数传递(即request(special_info);
)。但是其他子类不需要这个。是否有一种干净的方法可以隐藏这种差异或可以在这里使用的适当设计模式?
由于
答案 0 :(得分:0)
使基本request()
方法将信息作为参数,并忽略不需要它的子类实现中的参数。
或者将SubSystem实例本身传递给处理程序,让处理程序从SubSystem获取所需的信息(如果它不需要来自SubSystem的任何信息,则忽略它)。这将使设计更具可扩展性:每次引入需要附加信息的新子类时,您都不需要传递额外的参数并重构所有方法。
答案 1 :(得分:0)
JB Nizet的建议是一种可能的解决方案 - 它肯定会奏效。
让我担心的是一些相当模糊的概念,即“有些人需要更多信息”。这些信息来自哪里,是什么决定的?继承的一般原则是你有一个基类,它为所有对象做正确的事情。如果你必须说“它是类型A对象还是类型B对象,那么执行此操作,否则如果它的类型C对象执行稍微不同的操作,并且如果它是类型D对象,则执行另一种操作”,然后执行此操作做错了。
可能JB的建议对你来说是正确的,但我也会考虑将“special_info”传递给构造函数,或者通过一些辅助函数获取的选项。构造函数解决方案是理智的,因为在构造时,显然,您需要知道某些东西是您正在创建的A,B,C或D对象。辅助功能在其他时候是一个很好的解决方案,但如果使用不当,可能会导致一些混乱的解决方案,所以要小心使用。
一般来说,当这样的事情结束时,这是因为你正在以“错误的方式”分裂这些类。