具有继承的自引用泛型

领结

我有一个AnimalQueue类,它是Animals的队列。每个队列将仅存储某种类型的Animal,并且我想确保仅将与队列类型匹配的Animals添加到其中:

Public Class AnimalQueue(Of T As Animal)
    Public Sub Add(pA As T)
    End Sub
End Class

处理队列中的动物时,我想将正在处理该队列的队列传递给该动物,以防该动物要将另一个动物添加到同一队列中:

Public MustInherit Class Animal
    Public MustOverride Sub Process(Of T As Animal)(pAQ As AnimalQueue(Of T))
End Class

问题是,当我添加具体的类时,在调用Add时出现编译错误:

Public Class Horse
    Inherits Animal

    Public Overrides Sub Process(Of T As Animal)(pAQ As AnimalQueue(Of T))
        pAQ.Add(New Horse())
    End Sub
End Class

它说Horse不能转换为T,但是约束条件说T是动物,而Horse是动物...

马库斯

问题在于,T可能是源自动物的任何类别。假定以下类层次结构:

Horse -> Animal
Dog -> Animal

在你的代码,泛型参数TProcess约束为任何动物。因此,即使您在Horse上实现了它,以下调用也将完全有效:

Dim dogQ As New AnimalQueue(Of Dog)()
Dim h As New Horse()
h.Process(Of Dog)(dogQ)

在这种情况下,您的实现Process会尝试将添加Horse到的队列Dogs由于Horse不是从派生的Dog,因此您无法执行此操作。

我假设您要创建一个方法,以使Process方法Horse仅接受的队列,HorsesProcess方法Dog仅接受的队列Dogs

有几种方法可以实现此目的:

  1. 不要创建一个通用的Process基类的水平的方法,但只Process对孩子的水平的方法(如HorsePublic Sub Process(horseQ As AnimalQueue(Of Horse)))。
  2. 使用New约束并在级别上实现该方法Animal在您的评论中,您提到您的动物需要构造函数参数,因此这不是一种选择。
  3. 如果要具有定义通用方法的基类,则可以创建以下结构:

Public Class AnimalQueue(Of T As Animal)
    Public Sub Add(animal As T)
        ' ...
    End Sub
End Class

Public MustInherit Class Animal

End Class

Public MustInherit Class ProcessableAnimal(Of T As Animal)
    Inherits Animal

    Public MustOverride Sub Process(q As AnimalQueue(Of T))

End Class

Public Class Horse
    Inherits ProcessableAnimal(Of Horse)

    Public Overrides Sub Process(q As AnimalQueue(Of Horse))
        q.Add(New Horse())
    End Sub
End Class

Public Class Dog
    Inherits ProcessableAnimal(Of Dog)

    Public Overrides Sub Process(q As AnimalQueue(Of Dog))
        q.Add(New Dog())
    End Sub
End Class

在这种方法中,继承有了新的层次。但是重要的变化是您在类级别设置了通用类型参数。因此,决策是从ProcessableAninmal的调用者得出的,而不是留给的调用者Process

Dim h As New Horse()
Dim hQ As New AnimalQueue(Of Horse)()
Dim dQ As New AnimalQueue(Of Dog)()
h.Process(hQ) ' Valid
h.Process(dQ) ' NOT VALID ANYMORE

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

没有泛型的接口继承

来自分类Dev

具有右值引用成员的泛型复制构造函数

来自分类Dev

泛型IAbstract <T>继承自IAbstract

来自分类Dev

具有继承的泛型

来自分类Dev

如何检查具有继承的parameter_的泛型中的继承

来自分类Dev

具有继承和协方差的Java泛型

来自分类Dev

有什么方法可以在超类中定义泛型方法以引用继承类的类型?

来自分类Dev

具有泛型的类型类的RequestFactory客户端继承

来自分类Dev

Java中的自引用泛型

来自分类Dev

如何获得对具有指定类型的泛型类的构造函数的引用?

来自分类Dev

具有泛型构造函数的泛型类?

来自分类Dev

具有继承的C#泛型

来自分类Dev

泛型约束继承自泛型库

来自分类Dev

将具有多个继承的泛型类句柄转换为基类(即接口)

来自分类Dev

具有类继承和泛型类型继承的C#集合不允许添加继承的类

来自分类Dev

没有泛型的接口继承

来自分类Dev

具有继承的嵌套泛型接口

来自分类Dev

泛型IAbstract <T>继承自IAbstract

来自分类Dev

泛型类继承自Dictionary with Collection

来自分类Dev

泛型继承有什么问题

来自分类Dev

具有继承的类类型的泛型列表的类-多继承

来自分类Dev

具有继承的类类型的泛型列表的类

来自分类Dev

具有泛型和dynamic关键字的C#继承

来自分类Dev

如何继承具有不同泛型返回类型的方法

来自分类Dev

在具有循环引用的接口中使用泛型

来自分类Dev

具有泛型类型的 angular2/typescript 类继承

来自分类Dev

引用类型中的多继承泛型

来自分类Dev

具有低冗长性的 C 泛型继承

来自分类Dev

Kotlin 继承/带有泛型的声明