我有一个泛型类,仅限于实现某些接口的类型
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)
让我们回顾一下:Item1
和Item2
分别包含ChildClass1
或ChildClass2
的列表。这些列表中的每个成员都有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
,它会不会有所作为,是吗?
答案 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