2011-11-15 59 views
1

是否有一個基類,我應該繼承,這只是一個基本的名稱/值對?我可以繼承的名稱/值類?

例如,我有幾個只有兩個屬性(名稱和值)的類。他們都稱爲獨特的喜歡的字段,數據等等,都用於不同的東西,但內臟是相同的,兩個屬性(名稱和值),他們有一個相關的集合類繼承自CollectionBase。有什麼我可以做的,所以他們都共享相同的代碼或從相同的基類繼承,所以它不是多餘的?它們也位於組件的不同保護級別,所以我不想只爲每種情況使用相同的類。

Public Class Field 

     Public Sub New() 

     End Sub 

     Private _name As String 
     Public Property Name() As String 
      Get 
       Return _name 
      End Get 
      Set(ByVal value As String) 
       _name = value 
      End Set 
     End Property 

     Private _value As String 
     Public Property Value() As String 
      Get 
       Return _value 
      End Get 
      Set(ByVal value As String) 
       _value = value 
      End Set 
     End Property 

    End Class 


    Private NotInheritable Class FieldCollection 
     Inherits CollectionBase 

     Public Sub New() 

     End Sub 

     Public Sub Add(ByVal field As Field) 
      List.Add(field) 
     End Sub 

     Public Sub Remove(ByVal index As Integer) 
      If index > Count - 1 Or index < 0 Then 
       Console.WriteLine("Can't remove this item") 
      Else 
       List.RemoveAt(index) 
      End If 
     End Sub 

     Default Public ReadOnly Property Item(ByVal index As Integer) As Field 
      Get 
       Return CType(List.Item(index), Field) 
      End Get 
     End Property 

    End Class 

    Public Class Data 

     Public Sub New() 

     End Sub 

     Private _name As String 
     Public Property Name() As String 
      Get 
       Return _name 
      End Get 
      Set(ByVal value As String) 
       _name = value 
      End Set 
     End Property 

     Private _value As String 
     Public Property Value() As String 
      Get 
       Return _value 
      End Get 
      Set(ByVal value As String) 
       _value = value 
      End Set 
     End Property 

    End Class 


    Private NotInheritable Class DataCollection 
     Inherits CollectionBase 

     Public Sub New() 

     End Sub 

     Public Sub Add(ByVal data As Data) 
      List.Add(data) 
     End Sub 

     Public Sub Remove(ByVal index As Integer) 
      If index > Count - 1 Or index < 0 Then 
       Console.WriteLine("Can't remove this item") 
      Else 
       List.RemoveAt(index) 
      End If 
     End Sub 

     Default Public ReadOnly Property Item(ByVal index As Integer) As Data 
      Get 
       Return CType(List.Item(index), Data) 
      End Get 
     End Property 

    End Class 

等等

UPDATE

Here's a PasteBin of the code that I'm looking to streamline.希望這有助於。

回答

3

KeyValuePair<TKey, TValue>。例如,.NET的Dictionary<TKey, TValue>類使用此結構來存儲針對特定鍵的泛型值,並且只要繼承不成問題,它的聲音就應該適合您的要求。

然而,如果你想使用任何形式的繼承,那麼您可以使用.NET4s Tuple<T1, T2>(雖然這會導致.Item1.Item2),或者,如果確實需要繼承/需要,使用組合物來包裝KeyValuePair<TKey, TValue>轉換成自定義對象。

編輯:看到你的榜樣,這看起來像一個良好的使用情況爲Dictionary<string, string>。是否有一個特定的原因,你爲什麼不想使用一個詞典或任何其他集合,這是非常適合這個?你可以通過聲明他們或他們的方法內部的,私人的,受保護的等等來「保護」某些類,以避免它們漏到你的對象模型太深或太遠。

+1

這似乎是足夠的,但OP指出他不想使用相同的類,而'KeyValuePair'是'struct',所以繼承不是一個選項。 –

+0

我想寫一個繼承Tuple 的類,但是我無法使它工作。它只是告訴我Tuple 不包含帶0參數的構造函數。儘管我寫了一個構造函數,它帶有2個參數,一個Enum和一個字符串。 – Nick

+0

@Nick錯誤並不是抱怨你的繼承類,而是關於元組。由於Tuple沒有0參數構造函數,所以你必須自己調用其中一個可用的構造函數。例如。 public MyClass(Enum myEnum,string str):base(myEnum,str){}。雖然我不確定你爲什麼從Tuple繼承,而不是僅僅使用它或結構。 –

2

這聽起來像你尋找鍵值對,它是什麼,它聽起來就像

0

想到的第一個對象是KeyValuePair;但是,您的class不能從結構派生。我相信你可以繼承Tuple。但是有一點需要注意 - 元組基本上是不可變的。

此外,我不知道爲什麼你會寫你自己的類從CollectionBase派生。我沒有看到你所得到的收益 - 我會推薦使用List<Of Field> ...或List<Of Data>

我沒有想出這個很基本的解決方案:

Module Module1 
    Private fieldCollection As New List(Of Field) 

    Sub Main() 
     Dim _field As Field = New Field() 
     _field.Name = "Foo" 
     _field.Value = "BarBaz" 

     fieldCollection.Add(_field) 

    End Sub 

End Module 

Public Class Field 
    Inherits DataPair 

End Class 

Public MustInherit Class DataPair 
    Private _name As String 
    Public Property Name() As String 
     Get 
      Return _name 
     End Get 
     Set(ByVal value As String) 
      _name = value 
     End Set 
    End Property 

    Private _value As String 
    Public Property Value() As String 
     Get 
      Return _value 
     End Get 
     Set(ByVal value As String) 
      _value = value 
     End Set 
    End Property 
End Class 
0

一個KeyValuePair是一個結構,因此不能被繼承,但是可能對繼承基類的類有用。否則,我不相信你會繼承這樣一個班級。然而,你可以創建你自己的。

相關問題