是否有一个我应该继承的基类,它只是一个基本的名称/值对?
例如,我有几个只有两个属性(名称和值)的类。他们都称之为独特的字段,数据等,并且都用于不同的东西,但内部都是相同的,两个属性(名称和值),并且它们具有从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
等...
更新
Here's a PasteBin of the code that I'm looking to streamline.希望这会有所帮助。
答案 0 :(得分:3)
见KeyValuePair<TKey, TValue>
。这种结构例如由.NET的Dictionary<TKey, TValue>
类用于存储针对特定键的通用值,并且只要继承不是问题,它的声音应该适合您的要求。
但是,如果您确实想要使用任何类型的继承,那么您可以使用.NET4 Tuple<T1, T2>
(虽然这会导致.Item1
,.Item2
)或者,如果继承确实需要/需要,使用组合将KeyValuePair<TKey, TValue>
包装到自定义对象中。
修改:看到您的示例,这似乎是Dictionary<string, string>
的一个很好的用例。是否有一个特定的原因,你不想使用一个字典或任何其他构建的集合条款,这是非常适合这个?您可以通过将它们或其方法声明为内部,私有,受保护等来“保护”某些类,以避免它们在对象模型中过深或过深泄漏。
答案 1 :(得分:2)
听起来你正在寻找KeyValuePair,它听起来像是
答案 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
答案 3 :(得分:0)
你甚至可以更通用,并使用Tuple<T1,T2>
MSDN docs here
答案 4 :(得分:0)
KeyValuePair是一个结构,因此不能继承,但可能有助于代替继承基类的类。否则,我不相信你可以继承这样的课程。但是,您可以创建自己的。