【问题标题】:Implementing IComparable<T> in Generics: how can I access the Generic's Value?在泛型中实现 IComparable<T>:如何访问泛型的值?
【发布时间】:2019-04-16 05:41:47
【问题描述】:

我有一个泛型类如下(ValuePublic只是为了简单起见,实际上都是封装在属性中的):

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

现在我希望将lTest1lTest2 进行比较。但是,我需要对提取的Value进行测试:

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

但是这样做,我也可以使用

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

完全省略接口。

允许我在通用CompareTo 中访问Value 不是很有利吗,例如:

Return Value.CompareTo(Other.Value)

但是,Value 不是泛型中的可访问成员。

我在这里遗漏了什么,或者这是设计使然的不可访问性?如果有,目的是什么?

【问题讨论】:

  • 你不想成为IComparable(Of GenericInterval(Of T))吗?
  • 接受马格努斯的回答。

标签: .net generics icomparable


【解决方案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

如果TStructureValue 唯一属性,您可能还想将GenericInterval 转换为结构。 (它需要是不可变的)

【讨论】:

  • 当然不仅仅是T!价值不是唯一的属性。我已经大量考虑了结构,但是有 6 个构造函数,其中 1 个是必需的空 New() 构造函数来初始化与标准不同的默认值。还有其他怪癖,最终将结构变成了黑客。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
  • 2015-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-22
相关资源
最近更新 更多