[内详]B中有A的实例,A,B定义了相同的一个event,A抛消息给B,再由B往外抛,是否合理?
分层是一种比较好的模块化方法, 实际使用中也确实如此
但是这样会出现很多代码的重复, 比如标题中情况, 关于消息处理, 就有重复, 感觉与 DRY(Don't Repeat Yourself) 又抵触了
大家怎么认为? 又或者是如何处理这种问题的? 欢迎讨论
C# code
class A {
public event EventHandler TheEvent;
protected void RaiseTheEvent()
{
if (TheEvent != null) {
TheEvent(this, EventArgs.Empty);
}
}
}
class B {
public event EventHandler TheEvent;
protected void RaiseTheEvent()
{
if (TheEvent != null) {
TheEvent(this, EventArgs.Empty);
}
}
A _a = new A();
B()
{
_a.TheEvent += delegate
{
RaiseTheEvent();
};
}
}
------解决方案--------------------
A中的消息给A的调用者使用
B中的消息给B的调用者使用
没有冲突
如果C是B的调用者,则C只关心B的事件
例子中B是A的调用者,B只关心A的事件
C此时可以关心A的事件,也可以不关心
------解决方案--------------------
LZ的意思是代码冗余了?
有时为了便于改动维护而分层确实会造成部分代码冗余
------解决方案--------------------这种设计很合理,不同事件有不同用途,还可继承接口实现操作
------解决方案--------------------
我并没看出哪里有代码冗余,只是你在A和B里的事件名称相同而已。
这种做法是合理的。A可以有自己的事件,至于谁订阅了这个事件,A并不理会;代码中B订阅了A的事件,那么当B对A做了某种操作时,立刻会触发A中的这个事件,而这个事件又会由B转发给B的调用者(假设为C)。从C的角度看,是B发生了某件事情,但具体是谁使B发生了这件事?是A引起的,还是B本身自发的?就可以通过sender来判断。
------解决方案--------------------楼上的分析到位,把对象之间的依赖性进行分拆。
------解决方案--------------------我不喜欢,但我也在用.....
------解决方案--------------------我就这种类似的办法!
为了后期,就这样!