Реализация IComparable‹T› в Generics: как я могу получить доступ к Generic's Value?

У меня есть общий класс следующим образом (Value это Public только для простоты, на самом деле все это инкапсулировано в свойствах):

Public MustInherit Class GenericInterval(Of T As {Structure, IComparable})
    Public Value As T                     
End Class

Я хочу реализовать IComparable(Of T):

Public MustInherit Class GenericInterval(Of T As {Structure, IComparable})
    Implements IComparable(Of T)

    Public Value As T                     

    Public Function CompareTo(Other As T) As Int32 Implements IComparable(Of T).CompareTo
        Return Value.CompareTo(Other)
    End Function
End Class

Но действительно ли это правильно? Это кажется несколько «несоответствующим», как если бы я сравнил значение с универсальным типом.

В тестовом модуле я создаю 2 переменные и присваиваю им значения.

Dim lTest1 As New GenericInterval()
Dim lTest2 As New GenericInterval()

lTest1.Value = 4
lTest2.Value = 5

Теперь я ожидаю сравнить lTest1 с lTest2. Однако мне нужно выполнить тест на извлеченном Value:

If lTest1.CompareTo(lTest2.Value) >= 0 Then
End If

Но при этом я мог бы просто использовать

If lTest1.Value >= lTest2.Value Then ...

полное отсутствие интерфейса.

Не было бы выгодно разрешить мне доступ к Value уже в общем CompareTo, например:

Return Value.CompareTo(Other.Value)

Однако Value не является доступным членом универсального.

Я что-то здесь упускаю, или это недоступность по замыслу? Если да, то какова цель?


person Herb    schedule 16.04.2019    source источник
comment
Разве вы не хотите вместо этого быть IComparable(Of GenericInterval(Of T))?   -  person Damien_The_Unbeliever    schedule 16.04.2019
comment
Возьмите ответ Магнуса.   -  person Damien_The_Unbeliever    schedule 16.04.2019


Ответы (1)


Вам нужно реализовать IComparable(Of GenericInterval(Of T))

Public Class GenericInterval(Of T As {Structure, IComparable})
    Implements IComparable(Of GenericInterval(Of T))

    Public Sub New(value As T)
        Me.Value = value
    End Sub

    Public Readonly Value As T

    Public Function CompareTo(other As GenericInterval(Of T)) As Integer Implements IComparable(Of GenericInterval(Of T)).CompareTo
        Return Value.CompareTo(other.Value)
    End Function
End Class

Тестовое задание:

Sub Main
    Dim lTest1 As New GenericInterval(Of Integer)(4)
    Dim lTest2 As New GenericInterval(Of Integer)(5)

    Console.WriteLine(lTest2.CompareTo(lTest1))
End Sub

Если T является Structure и Value единственным свойством, вы можете также превратить GenericInterval в структуру. (это должно быть неизменным)

person Magnus    schedule 16.04.2019
comment
Не просто Т, конечно! Стоимость — не единственное свойство. Я уже много рассматривал структуры, но есть 6 конструкторов, 1 из них является обязательным пустым конструктором New() для инициализации значений по умолчанию, отличных от стандартных. Были и другие причуды, в конечном итоге превратившие структуру в халтуру. - person Herb; 16.04.2019