【发布时间】:2013-03-14 19:18:22
【问题描述】:
有几个类经常被其他类派生。它们是用户输入接收器,如按键接收器、按键释放接收器、鼠标移动接收器等。继承自这些的类例如是 hotkey-action,它继承自 key down 接收器和 key release 接收器,或者一个 camera-rotator,它继承自 mouse move 接收器。用户所做的输入将由另一个类转发到相应的接收器,因此任何输入接收器,例如相机旋转器需要在该转发类中注册。转发输入的类总是相同的,永远不会有两个。
当我的类的用户创建一个新的输入接收器时,一个继承自例如的类鼠标移动接收器,鼠标移动接收器需要知道转发类以便注册自己以接收鼠标输入。所以鼠标移动接收器构造函数的代码如下:
mouseMoveReceiverIF(inputforwarder* ifo)
{
ifo.registerInputReceiver(this);
}
由于很明显只有一个输入转发器,如果用户必须通过它不仅不那么直观,而且对于创建的每个输入接收器来说都是额外的输入。
但是,如果我将 inputforwarder 设置为单例或全局变量,以便输入接收器可以访问它而无需用户在构造函数中传递它,我会有其他问题:那么用户需要要知道 inputforwarder 在创建任何 inputforwarder 之前必须存在。没有什么会警告他,没有什么会迫使他首先创建输入转发器。程序会简单地崩溃,因为输入接收器会尝试向不存在的输入转发器注册。那会更糟。
一个有效和正确的方法是怎样的?上述示例的替代方法是什么?
谢谢!
【问题讨论】:
-
你的设计过于复杂(我的意思是真的过于复杂(是的,它是 FUBAR,你必须重新开始(是的,真的))。减少继承,最好是零,看看多态函数(
std::function来自<functional>在这里有帮助)。 -
@Zoidberg:感谢您的提示。我是一个没有经验的程序员,对你来说看起来很糟糕的设计对我来说看起来不错 - 我不知道它何时以及为什么会造成麻烦以及现在的方式,它很容易使用:用户创建一个从所需的基本输入接收器(例如 keydown 接收器)继承的输入接收器,只需要实现 onKeyDown 方法。我不确定您对使用多态函数的含义。类似函子模板的东西?并使用它向输入转发器注册任何类的方法(或任何其他函数)? (如果是这样,为什么会这样?)
标签: c++ interface singleton dependencies