首页 > 解决方案 > 如何在c#中添加具有泛型的抽象类作为委托的参数

问题描述

我有一个StatesHandler用泛型类型调用的抽象类T。在这个类中,我有一个从类中调用的委托:

public abstract class StatesHandler<T>
{
    public event Action<StatesHandler<T>> OnStatesChanged;

    private void Function(){
        OnStatesChanged(this);
    }
}

然后我有这个抽象类的实现,State枚举在哪里:

public class MyStatesHandler : StatesHandler<State>{}

在第三个类中,我向这个委托添加了一个监听器:

public class MyThirdClass
{
    private MyStatesHandler myStatesHandler;

    private void AddListener()
    {
        myStatesHandler.OnStatesChanged += StateChanged;
    }

    private void StateChanged(StatesHandler<State> statesHandler)
    {
    }
}

我的问题是为什么添加到侦听器的函数需要具有签名StatesHandler<State>而不是简单的MyStatesHandler

两者都不应该工作吗?

标签: c#genericsinheritancedelegatesabstract

解决方案


OnStatesChanged将 aStatesHandler<T>或任何从StatesHandler<T>.

因此假设我们也有

public class SomeOtherHandler : StatesHandler<State>{}

可以调用OnStatesChanged将此类的对象作为参数传递,因为它派生自StatesHandler<T>. 但是,这不能传递给

private void StateChanged(MyStatesHandler statesHandler)
{
}

MyStatesHandler因为和之间没有继承关系SomeOtherHandler

因此,事件处理程序必须采用基类参数。


推荐阅读