多态泛型(或类似的东西)

时间:2014-01-08 05:29:28

标签: c# generics casting

我不确定如何说出我想要的内容,所以我只会展示不起作用的代码:

abstract class EventListener<T> where T : IEvent
{
}

interface IEvent
{
}

/*
 * Simplified a bit, normally this class would use a dictionary of event listeners
 */
class Manager
{
    private EventListener<IEvent> listener;

    public void RegisterListener<T>(EventListener<T> subject) where T : IEvent
    {
        // here is the issue
        listener = subject;
    }
}

/*
 *  Implementation
 */

class FooEvent : IEvent
{
}

class FooListener : EventListener<FooEvent>
{
}

当我尝试将subject分配给listener时,会出现此问题。我在分配之前尝试过施法,但遇到了类似的问题:

EventListener<IEvent> casted = subject as EventListener<IEvent>;
events.Add(typeof(T), casted);

有没有办法让这项工作?

1 个答案:

答案 0 :(得分:1)

  1. 添加非通用接口IEventListener

    interface IEventListener
    { }
    
  2. EventListener<T>班级实施:

     abstract class EventListener<T> : IEventListener where T : IEvent
    {
    }
    
  3. 将您的Manager.listener字段类型更改为IEventListener

    private IEventListener listener;