2011-11-15 37 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是一个结构,因此不能被继承,但是可能对继承基类的类有用。否则,我不相信你会继承这样一个班级。然而,你可以创建你自己的。

相关问题