Имя / значение класса, который я могу унаследовать? - PullRequest
1 голос
/ 15 ноября 2011

Есть ли базовый класс, от которого я должен унаследовать, это просто базовая пара имя / значение?

Например, у меня есть несколько классов, которые имеют только два свойства (имя и значение). Все они называли что-то уникальное, например, Field, Data и т. Д., И все они используются для разных целей, но все они одинаковы, имеют два свойства (имя и значение), и у них есть связанный класс коллекции, который наследуется от 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

Вот PasteBin кода, который я хочу оптимизировать. Надеюсь, это поможет.

Ответы [ 5 ]

3 голосов
/ 15 ноября 2011

См. KeyValuePair<TKey, TValue>.Эта структура используется, например, классом .NET Dictionary<TKey, TValue> для хранения общих значений для определенного ключа, и по звукам его должны соответствовать вашим требованиям, если наследование не является проблемой.

Если, однако, вы хотите использовать наследование любого рода, вы можете использовать .NET4s Tuple<T1, T2> (хотя это приведет к .Item1, .Item2) или, в качестве альтернативы, если наследованиедействительно требуется / необходимо, используйте композицию, чтобы обернуть KeyValuePair<TKey, TValue> в пользовательский объект.

Редактировать: На вашем примере это выглядит как хороший вариант использования для Dictionary<string, string>.Есть ли какая-то конкретная причина, по которой вы не хотите использовать словарь или какие-либо другие встроенные в коллекцию предложения, которые вполне подойдут для этого?Вы всегда можете «защитить» определенные классы, объявив их или их методы внутренними, частными, защищенными и т. Д., Чтобы избежать их утечки слишком глубоко или слишком высоко в вашей объектной модели.

2 голосов
/ 15 ноября 2011

Похоже, вы ищете KeyValuePair, это то, что звучит как

0 голосов
/ 15 ноября 2011

KeyValuePair - это структура, и поэтому ее нельзя наследовать, но она может быть полезна вместо классов, которые наследуют базовый класс. В противном случае, я не верю, что есть такой класс, который вы можете наследовать. Однако вы можете создать свой собственный.

0 голосов
/ 15 ноября 2011

вы можете даже пойти более обобщенно и использовать Tuple<T1,T2> документы MSDN здесь

0 голосов
/ 15 ноября 2011

Первый объект, который приходит на ум - это 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...