但是这样会出现很多代码的重复, 比如标题中情况, 关于消息处理, 就有重复, 感觉与 DRY(Don't Repeat Yourself) 又抵触了
大家怎么认为? 又或者是如何处理这种问题的? 欢迎讨论
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();
};
}
}
11 个解决方案
#1
A中的消息给A的调用者使用
B中的消息给B的调用者使用
没有冲突
如果C是B的调用者,则C只关心B的事件
例子中B是A的调用者,B只关心A的事件
C此时可以关心A的事件,也可以不关心
B中的消息给B的调用者使用
没有冲突
如果C是B的调用者,则C只关心B的事件
例子中B是A的调用者,B只关心A的事件
C此时可以关心A的事件,也可以不关心
#2
LZ的意思是代码冗余了?
有时为了便于改动维护而分层确实会造成部分代码冗余
有时为了便于改动维护而分层确实会造成部分代码冗余
#3
这种设计很合理,不同事件有不同用途,还可继承接口实现操作
#4
public class Sender
{
public delegate void EventHandler(object sender);
public event EventHandler Event;
public void TEvent()
{
Console.WriteLine("event");
Event(this);
}
}
class Receiver
{
public Receiver(Sender sender)
{
sender.Event +=new Sender.EventHandler(OnEvent);
}
private void OnEvent(object sender)
{
Console.WriteLine("event" );
Console.Read();
}
}
{
public delegate void EventHandler(object sender);
public event EventHandler Event;
public void TEvent()
{
Console.WriteLine("event");
Event(this);
}
}
class Receiver
{
public Receiver(Sender sender)
{
sender.Event +=new Sender.EventHandler(OnEvent);
}
private void OnEvent(object sender)
{
Console.WriteLine("event" );
Console.Read();
}
}
#5
确实有合理的地方,但是楼上也有人提到了代码冗余
"copy-paste" 不是编程的大忌么,如果要分层,消息的层层转发势必会导致这样的重复代码,所以想知道有没有更好的办法?
btw. 这个方法在实际使用中也确实烦人,改了一边,另一边也要注意不能遗漏,代码姑且不说,就是注释也要保持同步
#6
我并没看出哪里有代码冗余,只是你在A和B里的事件名称相同而已。
这种做法是合理的。A可以有自己的事件,至于谁订阅了这个事件,A并不理会;代码中B订阅了A的事件,那么当B对A做了某种操作时,立刻会触发A中的这个事件,而这个事件又会由B转发给B的调用者(假设为C)。从C的角度看,是B发生了某件事情,但具体是谁使B发生了这件事?是A引起的,还是B本身自发的?就可以通过sender来判断。
这种做法是合理的。A可以有自己的事件,至于谁订阅了这个事件,A并不理会;代码中B订阅了A的事件,那么当B对A做了某种操作时,立刻会触发A中的这个事件,而这个事件又会由B转发给B的调用者(假设为C)。从C的角度看,是B发生了某件事情,但具体是谁使B发生了这件事?是A引起的,还是B本身自发的?就可以通过sender来判断。
#7
楼上的分析到位,把对象之间的依赖性进行分拆。
#8
有点像head first 第一章。
#9
看来多数朋友还是认可这样的处理方式 ;)
#10
我不喜欢,但我也在用.....
#11
我就这种类似的办法!
为了后期,就这样!
为了后期,就这样!
#1
A中的消息给A的调用者使用
B中的消息给B的调用者使用
没有冲突
如果C是B的调用者,则C只关心B的事件
例子中B是A的调用者,B只关心A的事件
C此时可以关心A的事件,也可以不关心
B中的消息给B的调用者使用
没有冲突
如果C是B的调用者,则C只关心B的事件
例子中B是A的调用者,B只关心A的事件
C此时可以关心A的事件,也可以不关心
#2
LZ的意思是代码冗余了?
有时为了便于改动维护而分层确实会造成部分代码冗余
有时为了便于改动维护而分层确实会造成部分代码冗余
#3
这种设计很合理,不同事件有不同用途,还可继承接口实现操作
#4
public class Sender
{
public delegate void EventHandler(object sender);
public event EventHandler Event;
public void TEvent()
{
Console.WriteLine("event");
Event(this);
}
}
class Receiver
{
public Receiver(Sender sender)
{
sender.Event +=new Sender.EventHandler(OnEvent);
}
private void OnEvent(object sender)
{
Console.WriteLine("event" );
Console.Read();
}
}
{
public delegate void EventHandler(object sender);
public event EventHandler Event;
public void TEvent()
{
Console.WriteLine("event");
Event(this);
}
}
class Receiver
{
public Receiver(Sender sender)
{
sender.Event +=new Sender.EventHandler(OnEvent);
}
private void OnEvent(object sender)
{
Console.WriteLine("event" );
Console.Read();
}
}
#5
确实有合理的地方,但是楼上也有人提到了代码冗余
"copy-paste" 不是编程的大忌么,如果要分层,消息的层层转发势必会导致这样的重复代码,所以想知道有没有更好的办法?
btw. 这个方法在实际使用中也确实烦人,改了一边,另一边也要注意不能遗漏,代码姑且不说,就是注释也要保持同步
#6
我并没看出哪里有代码冗余,只是你在A和B里的事件名称相同而已。
这种做法是合理的。A可以有自己的事件,至于谁订阅了这个事件,A并不理会;代码中B订阅了A的事件,那么当B对A做了某种操作时,立刻会触发A中的这个事件,而这个事件又会由B转发给B的调用者(假设为C)。从C的角度看,是B发生了某件事情,但具体是谁使B发生了这件事?是A引起的,还是B本身自发的?就可以通过sender来判断。
这种做法是合理的。A可以有自己的事件,至于谁订阅了这个事件,A并不理会;代码中B订阅了A的事件,那么当B对A做了某种操作时,立刻会触发A中的这个事件,而这个事件又会由B转发给B的调用者(假设为C)。从C的角度看,是B发生了某件事情,但具体是谁使B发生了这件事?是A引起的,还是B本身自发的?就可以通过sender来判断。
#7
楼上的分析到位,把对象之间的依赖性进行分拆。
#8
有点像head first 第一章。
#9
看来多数朋友还是认可这样的处理方式 ;)
#10
我不喜欢,但我也在用.....
#11
我就这种类似的办法!
为了后期,就这样!
为了后期,就这样!