事件处理程序,现有类到新接口
本文关键字:新接口 接口 程序 事件处理 | 更新日期: 2023-09-27 18:07:33
考虑到程序的目的现在已经改变,我正在为程序构建一些灵活性。我想添加一个接口,一个现有的类将实现。
现有类public class ClassA
{
#region Events
public delegate void DataReceivedHandler(object sender, EventArgs e);
public delegate void DataSentHandler(object sender, EventArgs e);
public delegate void StatusUpdatedHandler(object sender, EventArgs e);
public event DataReceivedHandler DataReceived;
public event DataSentHandler DataSent;
public event StatusUpdatedHandler StatusUpdated;
#endregion
//rest of code here...
}
新界面public interface IClassA
{
event EventHandler DataReceived;
event EventHandler DataSent;
event EventHandler StatusUpdated;
//rest of code here...
}
我的三个问题如下。
Q1。我是否应该首先在类中声明自己的委托,即public delegate void DataReceivedHandler
,或者应该删除这些委托,并用正常的EventHandler替换事件。即public event EventHandler DataReceived
。假设这些事件不与事件一起传递数据,只是通知任何订阅了某些更改的东西。
Q2。与上面的问题密切相关。假设我正在改变类的属性,即状态(StatusUpdated)。最佳实践是将新状态作为自定义EventArgs传递,从而需要像原始代码一样自定义委托吗?当它当前工作时,事件被触发,并且订阅的类可以只使用sender值,即(sender As ClassA). status。是否存在最佳实践,还是仅仅取决于开发人员?
第三季。现在这个问题已经解决了。关于接口的部分。我是否正确地声明了接口中的DataReceived和其他事件,以匹配将被标记为实现它的类?
如果您需要为接口方法定制委托,您应该单独声明它们(在类之外),因为它们不绑定到特定的实现。委托声明可以位于接口内部,就像类一样。您的委托的问题是它们都具有相同的签名 (EventHandler
的签名),因此是多余的。
如果在引发这些事件时不需要传递任何数据,则可以使用普通的EventHandler委托。但是,我希望通过DataReceived
事件获得一些数据,因此您应该检查这是否有意义,并可能使用接受一些数据作为参数的委托。
第三,接口事件签名必须与类签名匹配。您不能在接口中使用EventHandler
委托类型,而在类中更改签名。
注意,你也可以避免显式声明委托类型,并使用BCL提供的通用Action
委托(从。net 3.5开始)。在这种情况下,您可能会输入如下内容:
public interface IClassA
{
event Action<IClassA, Data> DataReceived;
event Action<IClassA, Data> DataSent;
event Action<IClassA, Status> StatusUpdated;
}
后一种方法为您提供了一个强类型的sender
参数(与EventHandler
中的object
相反)。
在回答你的问题时,当然这些是个人意见的问题,所以我将给出我的看法:
A1)不,你重新声明自己的XXXHandler
委托是不对的,框架中有一个(EventHandler
)与你的完全匹配——这是一个很好的迹象,表明你在"重新发明轮子"。
A2)我认为一个名为StatusChanged
的事件应该将新的(也可能是旧的)状态传递给任何订阅者。然而,这仍然不是实现你自己的委托的理由,因为框架定义了一个通用委托(EventHandler<TEventArgs>
)正是为了这个目的。
A3)此刻你的类的事件不匹配的接口,这意味着它将无法实现它没有改变。
Docs: EventHandler<TEventArgs>