2012-01-02 70 views
0

我需要从SchoolGroup,但不是从School修改孩子。 我怎样才能实现对SchoolGroup类相同的属性,知道我需要从任何Collective迭代孩子,但添加和从SchoolGroup ....列表(属性)访问和继承:iterration和修改

Class Collective 
    ' just iteration ' 
    Public MustOverride Children as ReadonlyList(Of Child) 

Class School 
    Inherits Collective 
    ' just iteration foreach SchoolGroup' 
    Public Overrides Property Children as ReadonlyList(Of Child) 

Class SchoolGroup 
    Inherits Collective 
    ' iteration and modification ' 
    Public Overrides Property Children as ReadonlyList(Of Child) 
    ' CANT USE THE SAME NAME.... ' 
    Public Property Children as List(Of Child) 

回答

1

Shadow在SchoolGroup仅删除属性,以便你可以用不同的返回类型来实现它。

Public Class Collective 
    Public Overridable Property Children As ReadonlyList(Of Child) 
End Class 

Public Class School 
    Inherits Collective 
    Public Overrides Property Children As ReadonlyList(Of Child) 
End Class 

Public Class SchoolGroup 
    Inherits Collective 
    Public Shadows Property Children As List(Of Child) 
End Class 

顺便说一句:你也许可以转储ReadonlyList(Of Child)赞成IEnumerable(Of Child),这基本上是枚举目的的只读列表。

+0

我需要在集体进行迭代的儿童。 – serhio 2012-01-02 16:49:52

+0

相应地更改了我的答案。另外,如果你想遍历'Collective'中的属性,它必须设置为'Overridable'而不是MustOverride' – 2012-01-02 16:58:53

+0

+1。我喜欢IEnumerable方法,因为它默认是只读的。然后,List(Of Child)将保持私有状态,并且ScoolGroup将具有像AddChild,RemoveChild这样的方法。 – 2012-01-02 17:55:36

1

我个人更喜欢在这种情况下的界​​面,因为Collective没有任何实际的儿童数据,学校和SchoolGroup都没有通过压倒财产获得任何真正的优势。

例如:

Public Interface IChildren 
    Function GetEnumerator() As System.Collections.Generic.IEnumerator(Of Child) 
End Interface 

Public MustInherit Class Collective 
    Implements IChildren 

    Public MustOverride Function GetEnumerator() As System.Collections.Generic.IEnumerator(Of Child) Implements IChildren.GetEnumerator 
End Class 

Public Class School 
    Inherits Collective 

    Public Property Children As New ReadOnlyList(Of Child) 

    Public Overrides Function GetEnumerator() As System.Collections.Generic.IEnumerator(Of Child) 
     Return Children.GetEnumerator 
    End Function 
End Class 

Public Class SchoolGroup 
    Inherits Collective 

    Public Property Children As New List(Of Child) 

    Public Overrides Function GetEnumerator() As System.Collections.Generic.IEnumerator(Of Child) 
     Return Children.GetEnumerator 
    End Function 
End Class 

这可以被用作:

Dim oGroup As New SchoolGroup 
    oGroup.Children.Add(New Child) 
    ProcessChildren(oGroup) 

其中过程的儿童接受一个接口实现者

Public Sub ProcessChildren(oCollection As IChildren) 
    For Each oChild As Child In oCollection 
     ' Do something 
    Next 
End Sub