如何创建一个函数来接受继承公共类的任何项集合?

时间:2014-04-11 05:57:33

标签: vb.net

我有一个名为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集合类,因为将我的东西存储在那些集合类中会涉及大量的转换以获取其他所需的特定数据。

这有什么简单的补救措施吗?

1 个答案:

答案 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

这实际上归结为如果您有三种类型,T1T2G(Of T)T1T2都有一个继承关系,它不以任何方式表示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