我可以继承的名称/价值类?

时间:2011-11-15 15:08:49

标签: .net class collections dictionary

是否有一个我应该继承的基类,它只是一个基本的名称/值对?

例如,我有几个只有两个属性(名称和值)的类。他们都称之为独特的字段,数据等,并且都用于不同的东西,但内部都是相同的,两个属性(名称和值),并且它们具有从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.希望这会有所帮助。

5 个答案:

答案 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是一个结构,因此不能继承,但可能有助于代替继承基类的类。否则,我不相信你可以继承这样的课程。但是,您可以创建自己的。