当基类也具有泛型时,是否可以继承具有泛型的类



我为这个令人困惑的标题道歉,我不太确定如何简洁地表达我的问题。在这里,我有一个不编译的类结构。

class MyEvent
{ }
class EventA : MyEvent
{ }
class EventB : MyEvent
{ }
class MyEventHandler<T>
where T : MyEvent
{ }
class EventAHandler : MyEventHandler<EventA>
{ }
class EventBHandler : MyEventHandler<EventB>
{ }
/*** Tests ***/
abstract class MyEventHandlerTesterBaseClass<SomeEventHandler>
where SomeEventHandler : MyEventHandler<MyEvent>
{
// Plan to set up handler for the concrete test classes below.
protected SomeEventHandler handler;  
}
class EventAHandlerTests : MyEventHandlerTesterBaseClass<EventAHandler>
{ }
class EventBHandlerTests : MyEventHandlerTesterBaseClass<EventBHandler>
{ }

它导致我的class EventAHandlerTests定义出现以下错误:

The type 'EventAHandler' must be convertible to 'MyEventHandler<MyEvent>' in order to use it as parameter 'SomeEventHandler' in the generic class 'MyEventHandlerTesterBaseClass<SomeEventHandler>'

并且类似地用于CCD_ 2。

我的理解是EventAHandler应该可以转换为MyEventHandler<MyEvent>,因为EventAHandler继承了MyEventHandler<EventA>,因此EventA应该动态绑定到MyEvent

我做错什么了吗?或者这是不可能的?

问题是T类型的泛型类不能强制转换为U:T类型的另一个泛型类。

例如:

class Foo { }
class Bar : Foo { }
void test()
{
List<Bar> bars;
List<Foo> foos = bars; //does not work!!!
}

在您的情况下,MyEventHandlerTesterBaseClass期望泛型类型为MyEventHandler<MyEvent>,但EventAHandlerMyEventHandler<EventA>类型,因此不起作用。这可以通过使用两个类似的泛型来规避:

abstract class MyEventHandlerTesterBaseClass<THandler, TEvent>
where THandler : MyEventHandler<TEvent>
where TEvent : MyEvent

相关内容

  • 没有找到相关文章

最新更新