2010-10-19 78 views
1

我有一個包含另一個基類(例如:ClassA)的列表的基類(例如:Class1)。包含第二個基類的子類的列表的第一個基類(例如:Class1AA,Class1AB,..)的每個子類(例如:ClassAA,ClassAB,...)覆蓋「基類列表」屬性並返回「子類列表」

客戶端永遠不會知道哪個子類正在使用,那麼我不認爲我可以使用泛型爲我的基類。

我嘗試這樣的事情,還有更多,但我總是收到錯誤..

Imports System.Collections.Generic 

Public Class Client 

    Public Sub DoAction(obj as Class1) 
     For Each item as ClassA in obj.ItemList 
     ... 
     Next 
    End Sub 

End Class 

Public MustInherit Class Class1 
    Public MustOverride ReadOnly Property ItemList() As IList(Of ClassA) 

End Class 

Public Class Class1AA 
    Inherits Class1 

    Public Overrides ReadOnly Property ItemList() As IList(Of ClassA) 
     Get 
      Return New List(Of ClassAA) 
     End Get 
    End Property 
End Class 

Public Class Class1AB 
    Inherits Class1 

    Public Overrides ReadOnly Property ItemList() As IList(Of ClassA) 
     Get 
      Return New List(Of ClassAB) 
     End Get 
    End Property 
End Class 

Public Class ClassA 

End Class 

Public Class ClassAA 
    Inherits ClassA 

End Class 

Public Class ClassAB 
    Inherits ClassA 

End Class 

感謝您的幫助

回答

1

該代碼將要求其不存在VB通用協方差。

基本上List(Of Base)List(Of Derived)之間沒有關係。否則,下面的代碼可以寫爲:

Dim a As New List(Of Base)() 
a.Add(New Base()) 

Dim b As List(Of Derived) = a 
''// Can’t work: b(0) doesn’t contain a `Derived` instance! 
Dim x As Derived = b(0) 

但是,您可以簡單地返回一個List(Of ClassA)無處不在,把派生的對象到該列表。

+0

我認爲你的意思是「返回值協方差」 – JaredPar 2010-10-19 15:02:33

+0

@Jared:否 - 返回值協方差還涉及委託類型的兼容性,VB *有* this。我的意思是泛型類型的協變性。我認爲這被稱爲「通用協方差」。據全能谷歌稱,至少我不是唯一一個這樣使用它的人。 ;-) – 2010-10-19 15:05:40

+0

@Konrad它看起來像OP要求讓子屬性返回List(Of Child)而不是List(父)(在C++中是合法的)。我認爲這被稱爲「返回值協方差」 – JaredPar 2010-10-19 15:07:59