事件处理程序,现有类到新接口

本文关键字:新接口 接口 程序 事件处理 | 更新日期: 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>