实现IComparable 在泛型中:我如何访问Generic的值?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现IComparable 在泛型中:我如何访问Generic的值?相关的知识,希望对你有一定的参考价值。

我有一个泛型类如下(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

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

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

但通过这样做,我也可以使用

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

完全省略界面。

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

Return Value.CompareTo(Other.Value)

但是,Value不是通用中的可访问成员。

我在这里想念一些东西,还是设计难以接近?如果是这样,目的是什么?

答案

你需要实现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只是StructureValue属性,你可能也想把GenericInterval变成一个结构。 (它需要是不可变的)

以上是关于实现IComparable 在泛型中:我如何访问Generic的值?的主要内容,如果未能解决你的问题,请参考以下文章

C# 在泛型中重复使用类型时缩短语法?

Java泛型中通配符的使用

如何在泛型集合上创建扩展方法

java泛型 通配符

如何要求泛型类型在泛型函数中实现 Add、Sub、Mul 或 Div 之类的操作?

使用通配符增强泛型