当前位置: 代码迷 >> VB Dotnet >> vb.net中的IComparable用法的奇怪有关问题
  详细解决方案

vb.net中的IComparable用法的奇怪有关问题

热度:53   发布时间:2016-04-25 02:15:36.0
vb.net中的IComparable用法的奇怪问题
Option Strict Off   
'  声明一个使用 IComparable 接口的类 Vector  
Public Class Vector : Implements IComparable
    Public X As Integer
    Public Y As Integer

    Public Sub New()
        X = 0
        Y = 0
    End Sub

    Public Sub New(ByVal vX As Integer, ByVal vY As Integer)
        X = vX
        Y = vY
    End Sub  

    Public Sub Show()       '用来显示向量坐标 (X,Y)
        Console.Write("({0},{1})  ", X, Y)
    End Sub

    '实现出 IComparable 接口中的 CompareTo 方法
    Public Function CompareTo(ByVal obj As Object) As _
                Integer Implements IComparable.CompareTo
        Return (X ^ 2 + Y ^ 2) - (obj.X ^ 2 + obj.Y ^ 2)
    End Function
End Class

Module Module1

    Sub Main()
        Dim I As Integer
        Dim vecArray() As Vector

        '定义一个内含五个向量的数组         
        vecArray = New Vector() {New Vector(20, 10), _
                                 New Vector(50, 20), _
                                 New Vector(90, 40), _
                                 New Vector(10, 10), _
                                 New Vector(40, 30)}
        Console.WriteLine("乐博网提示:排序前 ...")
        For I = 0 To UBound(vecArray)
            vecArray(I).Show()
        Next
        Console.WriteLine()

        Array.Sort(vecArray)    '调用 System.Array 类的 Sort 方法

        Console.WriteLine("乐博网提示:排序后 ...")
        For I = 0 To UBound(vecArray)
            vecArray(I).Show()
        Next
        Console.WriteLine()
        Console.Read()
    End Sub

End Module


上面示例中的委托函数
    Public Function CompareTo(ByVal obj As Object) As _
                Integer Implements IComparable.CompareTo
        Return (X ^ 2 + Y ^ 2) - (obj.X ^ 2 + obj.Y ^ 2)
    End Function

我们一般调用时直接委托函数名称CompareTo来调用。
上面示例中Sub Main过程中没有调用CompareTo痕迹,但是,运行时委托过程确实起到作用。
不调用CompareTo名称能够起到作用真是罕见。
请程序员详细解释这个问题。上面代码是完整的,可以直接复制到工程能够运行。



------解决方案--------------------
引用:
Quote: 引用:

接口就是干这个的。不用你去调用,你实现了接口,人家的 sort 方法会自动使用。


那么,凭什么来识别判断调用呢

请列出代码示例一下说明。

在CompateTo中任意一行下断点。
调试,运行到此处。
然后打开调用堆栈
可以看到谁调用你了。

另外你想想,不知道相互大小关系,sort凭什么排序的。
------解决方案--------------------
看文档。或者有源代码看源代码。