2012-02-14 4 views
0

Допустим, у меня есть общий интерфейс (VB.NET):Как использовать общий список, который принимает в производных классах, который реализует общий интерфейс

Public Interface IBase(Of T As {IBase(Of T)}) 
    Property Parent() As T 

И у меня есть 2 классов, реализующий интерфейс

Public Class Derive1 
    Implements IBase(Of Derive1) 
    Public Property Parent() As Derive1 Implements IBase(Of Derive1).Parent 

Public Class Derive2 
    Implements IBase(Of Derive2) 
    Public Property Parent() As Derive2 Implements IBase(Of Derive2).Parent 

Как использовать общий список, который может принимать как Derive1 и Derive2 такого, что:

genList.Add(Derive1) 
genList.Add(Derive2) 
+2

Какова взаимосвязь между IBase и IBasicPortfolio? – CodeThug

+0

К сожалению, в образце кода была опечатка. IBase - это общий интерфейс, который реализует оба класса. Я обновил образец кода. – user1208214

ответ

0

Mak e Derive1 и Derive2 реализуют общий интерфейс, а затем создают список этого интерфейса. Например, предположим, что вы хотите перебирать свой общий список и иметь такой метод, как CountChildren, который вы можете выполнять как на объектах Derive1, так и на Derive2 в этом списке. Во-первых, вы хотите, чтобы создать интерфейс, например:

Public Interface ICalculations 
    Function CountChildren() As Integer 
End Interface

Затем вы хотите настроить Derive1 и Derive2 так, что они реализуют этот интерфейс. Вот что это может выглядеть следующим образом:

Public Class Derive1 
    Implements IBasicPortfolio(Of Derive1) 
    Implements ICalculations 
    Public Property Value() As Integer 
     Get 
      Return m_Value 
     End Get 
     Set 
      m_Value = Value 
     End Set 
    End Property 
    Private m_Value As Integer 
    Public Property [Next]() As Derive1 
     Get 
      Return m_Next 
     End Get 
     Set 
      m_Next = Value 
     End Set 
    End Property 
    Private m_Next As Derive1 
    Public Function CountChildren() As Integer 
     Return 1 + [Next].CountChildren() 
    End Function 
End Class 

Public Class Derive2 
    Implements IBasicPortfolio(Of Derive2) 
    Implements ICalculations 
    Public Property Value() As Integer 
     Get 
      Return m_Value 
     End Get 
     Set 
      m_Value = Value 
     End Set 
    End Property 
    Private m_Value As Integer 
    Public Property [Next]() As Derive1 
     Get 
      Return m_Next 
     End Get 
     Set 
      m_Next = Value 
     End Set 
    End Property 
    Private m_Next As Derive1 
    Public Function CountChildren() As Integer 
     Return 1 + [Next].CountChildren() 
    End Function 
End Class

Затем вы можете создать список ICalculations, который может содержать как Derive1 и Derive2 объекты:

Dim foo = New List(Of ICalculations)() 

foo.Add(New Derive1()) 
foo.Add(New Derive2()) 

For Each bar As var In foo 
    bar.CountChildren() 
Next