使用不同的T但共同的祖先

时间:2015-09-27 15:53:35

标签: .net vb.net generics inheritance

类定义

我有一个泛型类,仅限于实现某些接口的类型

Public Class GenericClass(Of T As {IMyInterface1, IMyInterface2})
    'These are items I want to iterate over
    Public Property Stuff As List(Of T)
End Class

现在我有一个实现所述接口的MustInherit

Public MustInherit Class BaseClass
    Implements IMyInterface1
    Implements IMyInterface2

    Public Sub DoSomething()
       'This is a method I want to call while iterating
    End Sub
End Class

以及此基类的一些子类

Public Class ChildClass1
    Inherits BaseClass
End Class
Public Class ChildClass2
    Inherits BaseClass
End Class

现在我创建了一些对象

Dim Item1 As New GenericClass(Of ChildClass1)
Dim Item2 As New GenericClass(Of ChildClass2)

我想做什么

让我们回顾一下:Item1Item2分别包含ChildClass1ChildClass2的列表。这些列表中的每个成员都有DoSomething继承自BaseClass的方法。

我想为每个列表中的任何成员打电话DoSomething()

我尝试了什么

当然,我可以单独遍历每个ItemX中的列表。但由于我在实际程序中有两个以上,所以这非常混乱。

我想不出将Item1和Item2组合成一个列表来迭代的方法。我无法使用

Dim Items As New List(Of GenericClass(Of BaseClass))
Items.Add(Item1)
Items.Add(Item2)
For Each Item As GenericClass(Of BaseClass) In Items
    For Each SubItem As BaseClass In Item.Stuff
        SubItem.DoSomething()
    Next
Next

给出了设计时错误:

  

BC30311类型' GenericClass(Of ChildClass1)'的值无法转换为' GenericClass(Of BaseClass)'

在第二行。

最后

有没有什么方法可以解决这个难题,而不是在上面的例子中跳过外部循环并为每个ItemX编写相同的代码?

据我所知,如果我将GenericClass限制为BaseClass,它会不会有所作为,是吗?

1 个答案:

答案 0 :(得分:0)

  

有没有什么方法可以解决这个难题,而不是在上面的例子中跳过外部循环并为每个ItemX编写相同的代码?

更改GenericClass以实现以下界面:

Interface IGenericClass(Of Out T As {IMyInterface1, IMyInterface2})
    ReadOnly Property Stuff As IEnumerable(Of T)
End Interface

现在你可以迭代所有项目和东西:

Dim Items As IEnumerable(Of IGenericClass(Of BaseClass)) = {
    New GenericClass(Of ChildClass1), New GenericClass(Of ChildClass2)}

For Each Item In Items
    For Each SubItem In Item.Stuff
        SubItem.DoSomething()
    Next
Next