我有一个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
在你的代码,泛型参数T
的Process
约束为任何动物。因此,即使您在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
仅接受的队列,Horses
而Process
方法Dog
仅接受的队列Dogs
。
有几种方法可以实现此目的:
Process
基类的水平的方法,但只Process
对孩子的水平的方法(如Horse
:Public Sub Process(horseQ As AnimalQueue(Of Horse))
)。New
约束并在级别上实现该方法Animal
。在您的评论中,您提到您的动物需要构造函数参数,因此这不是一种选择。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] 删除。
我来说两句