当基础 class 也有泛型时,是否可以继承带有泛型的 class?
Is it possible to inherit a class with generics when the base class also has generics?
对于令人困惑的标题,我深表歉意,我不太确定如何简明扼要地表达我的问题。
在这里,我有一个无法编译的 class 结构。
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>'
EventBHandlerTests
.
也类似
我的理解是 EventAHandler
应该可以转换为 MyEventHandler<MyEvent>
因为 EventAHandler
继承了 MyEventHandler<EventA>
,因此 EventA
应该动态绑定到 MyEvent
.
我是不是做错了什么?或者这是不可能的?
问题是类型 T 的泛型 class 无法转换为类型 U : T 的另一个泛型 class。
例如:
class Foo { }
class Bar : Foo { }
void test()
{
List<Bar> bars;
List<Foo> foos = bars; //does not work!!!
}
在您的情况下,MyEventHandlerTesterBaseClass
期望泛型类型为 MyEventHandler<MyEvent>
,但 EventAHandler
的类型为 MyEventHandler<EventA>
,因此不起作用。这可以通过使用两个泛型来规避,如下所示:
abstract class MyEventHandlerTesterBaseClass<THandler, TEvent>
where THandler : MyEventHandler<TEvent>
where TEvent : MyEvent
对于令人困惑的标题,我深表歉意,我不太确定如何简明扼要地表达我的问题。 在这里,我有一个无法编译的 class 结构。
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>'
EventBHandlerTests
.
我的理解是 EventAHandler
应该可以转换为 MyEventHandler<MyEvent>
因为 EventAHandler
继承了 MyEventHandler<EventA>
,因此 EventA
应该动态绑定到 MyEvent
.
我是不是做错了什么?或者这是不可能的?
问题是类型 T 的泛型 class 无法转换为类型 U : T 的另一个泛型 class。
例如:
class Foo { }
class Bar : Foo { }
void test()
{
List<Bar> bars;
List<Foo> foos = bars; //does not work!!!
}
在您的情况下,MyEventHandlerTesterBaseClass
期望泛型类型为 MyEventHandler<MyEvent>
,但 EventAHandler
的类型为 MyEventHandler<EventA>
,因此不起作用。这可以通过使用两个泛型来规避,如下所示:
abstract class MyEventHandlerTesterBaseClass<THandler, TEvent>
where THandler : MyEventHandler<TEvent>
where TEvent : MyEvent