【发布时间】:2014-10-31 10:37:51
【问题描述】:
好的,所以信号和槽允许一个对象和方法与另一个对象及其方法之间的松散耦合连接。这很好,但这些信号槽对象作为父类的公共成员存在,因此它们的暴露破坏了松散耦合以创建紧密耦合的代码。这是相当消极的事情。不应该将信号设为私有,以便父类处理信号的连接/断开连接吗?
【问题讨论】:
好的,所以信号和槽允许一个对象和方法与另一个对象及其方法之间的松散耦合连接。这很好,但这些信号槽对象作为父类的公共成员存在,因此它们的暴露破坏了松散耦合以创建紧密耦合的代码。这是相当消极的事情。不应该将信号设为私有,以便父类处理信号的连接/断开连接吗?
【问题讨论】:
嗯,某事需要知道,当eventFoo 发生在ObjectA 上时,需要调用ObjectB 上的handlerBar。
在最简单的无委托实现中,该责任由ObjectA 负责,它在其eventFoo 主体中调用ObjectB->handlerBar。这要求它知道ObjectB,并且知道ObjectB->handlerBar 是正确的调用方式。相比之下,ObjectB 不需要知道ObjectA。
在使用信号和槽的一种方法中,责任在于ObjectB。它负责将其handlerBar 注册为eventFoo 信号的处理程序。所以它需要知道ObjectA,但ObjectA不需要知道ObjectB。
在另一种方法中,ObjectB 将handlerBar 公开为一个插槽,而其他一些代码将eventFoo 连接到handlerBar。那个“其他代码”需要知道ObjectA 和ObjectB,但两者都不需要知道另一个。
因此,当有人谈到减少耦合的信号和槽时,他们的意思是事件生成对象和事件处理对象不再显式地相互耦合,因为他们的职责之一是维护耦合。相反,耦合是由一段独立的代码来执行的,该代码负责耦合,并且独立于对象的其余接口。
现在,您提到了“父类”,这让我认为您是在考虑其中一个类已经与另一个类耦合的情况。在这种情况下,就减少耦合而言,公共信号和插槽并没有什么好处。
【讨论】: