【问题标题】:Is it possible to inherit a class with generics when the base class also has generics?当基类也有泛型时,是否可以继承具有泛型的类?
【发布时间】:2021-07-28 04:51:05
【问题描述】:

对于令人困惑的标题,我深表歉意,我不太清楚如何简明扼要地表达我的问题。 在这里,我有一个无法编译的类结构。

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&lt;MyEvent&gt;,因为EventAHandler 继承MyEventHandler&lt;EventA&gt;,因此EventA 应该动态绑定到MyEvent

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

【问题讨论】:

标签: c# generics inheritance dynamic-binding


【解决方案1】:

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

例如:

class Foo { }
class Bar : Foo { }

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

在您的情况下,MyEventHandlerTesterBaseClass 期望泛型类型为MyEventHandler&lt;MyEvent&gt;,但EventAHandler 的类型为MyEventHandler&lt;EventA&gt;,因此不起作用。这可以通过使用两个泛型来规避,如下所示:

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

【讨论】:

    猜你喜欢
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    相关资源
    最近更新 更多