我有一个名为baseForm的类。它的唯一目的是继承它们,为它们的后代提供一些基本功能,并作为其他类的通用类型来填充这些后代。
然后我想创建一些方便的共享函数来处理这些后代的集合,不管它们的具体类型是什么(因为它们不需要特定的数据),但遇到了问题。
我有这个示例函数
Public Shared Function getCommonKeys(forms As List(Of baseForm)) As keyCollection
Dim ret As New keyCollection
For i = 0 To forms.Count - 1
ret.AddRange(forms(i).keys)
Next
Return ret
End Function
这一切都很好,直到我尝试这样做
Public Class fancyForm
Inherits baseForm
End Class
....
Dim fancyForms As List(Of fancyForm) = {New fancyForm()}.toList
Dim keys As keyCollection = baseForm.getCommonKeys(fancyForms)
它不接受List(Of fancyForm)
为List(Of baseForm)
,即使这对单个对象也适用。
我不想创建一个明确的baseForm
集合类,因为将我的东西存储在那些集合类中会涉及大量的转换以获取其他所需的特定数据。
这有什么简单的补救措施吗?
答案 0 :(得分:0)
如果你需要做的就是遍历这些项目,你可以用IEnumerable(Of T)
而不是List(Of T)
来实现你的功能:
Public Shared Function getCommonKeys(forms As IEnumerable(Of baseForm)) As keyCollection
现在可以使用,因为IEnumerable(Of T)
在其类型参数中是covariant。
它无法以原始格式运行,因为您的调用代码认为它具有List(Of fancyForm)
- 如果它在原始代码中有效,getCommonKeys
将只使用List(Of baseForm)
- 然后是什么阻止它尝试向该列表添加新的OtherFancyForm
?
这实际上归结为如果您有三种类型,T1
,T2
和G(Of T)
,T1
和T2
都有一个继承关系,它不以任何方式表示G(Of T1)
和G(Of T2)
具有相同的继承关系 - 事实上,它们没有这样的关系。
我还会改变你方法的主体以使用更多的惯用风格:
Dim ret As New keyCollection
For Each frm as baseForm in forms
ret.AddRange(frm.keys)
Next
Return ret