2009-04-28 75 views
0

我有一個基類,稱爲原始圖形。派生自這個類是幾種不同類型的圖形,方塊,矩形,線條等。派生類成員添加到自定義collectionbase時不可用

我將這些圖形存儲在繼承collectionbase的對象中。這會導致一個問題,因爲當它們被添加到集合中時,我無法訪問派生類中的任何成員。 這裏是我的primitivecollection類的默認屬性

Public Class PrimitiveCollection 
    Inherits CollectionBase 
    ''' <summary> 
    ''' Get or set a primitive object by index 
    ''' </summary> 
    Default Public Property Item(ByVal index As Integer) As Primitive 
     Get 
      Return DirectCast(List(index), Primitive) 
     End Get 
     Set(ByVal value As Primitive) 
      List(index) = value 
     End Set 
    End Property 

我目前的解決辦法是,只是把所有的公衆成員的基類,然而,這開始看起來醜陋,我補充一點,需要會員更多派生類僅適用於派生類

回答

1

你的問題是關於繼承和接口。以下是我的看法

每個Primitive應實現一個接口,IPrimitive。集合中的每個原子都實現IPrimitive,IPrimitive中唯一的東西就是適用於所有類型IPrimitive的東西。例如:Draw()

所以,當你使用你的集合時,你有一個可繪製對象的集合。如果您打算將集合作爲僅包含矩形的集合使用,則應該使用列表<矩形>而不是一系列基元。

將更多屬性放在基類(或IPrimitive)上是一個壞主意,因爲它們對所有對象都沒有意義。寬度可以用於矩形,但在使用梯形或三角形時會變得陰暗。相反,共同性應該儘可能少地與作爲集合的對象一起工作。當你需要使用對象作爲派生類時,你應該引用它們而不使用集合。

0

您需要將集合中的實例轉換爲派生類型才能訪問其特定成員。

我將添加一個例子:

PrimitiveCollection primitives = GetPrimitives() ' this gets a mixture of types 
If GetType(PrimitiveRectangle) = primitives[0].GetType() Then 
    ' this is a PrimitiveRectangle object 
    PrimitiveRectangle rect = CType(primitives[0], PrimitiveRectangle) 
    ' now you can access specialized members through rect 
End If 

我沒有在幾年使用VB.NET,所以有可能是語法問題...

1

如果您要在單個集合中存儲多種類型的對象,那麼您需要在它們之間進行轉換以訪問特定於類型的成員,是的。

如果實際上將多個單一派生類型的對象存儲在一個集合中,則應該考慮使用泛型,以便集合保持強類型化(即編譯器知道該集合僅包含派生實例類型)。