Внедрение IComparable <T>в Generics: как я могу получить доступ к Generic's Value? - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть общий класс следующим образом (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 не является доступным членом в общем.

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

1 Ответ

3 голосов
/ 16 апреля 2019

Вам необходимо реализовать 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 в структуру также.(это должно быть неизменным)

...