如何隐藏模块中的 Object.Equals() 方法?

How to shadow Object.Equals() method in a Module?

也许问题的标题不合适,因为模块中的方法不能隐藏,但本质上我想隐藏一个基础成员再次声明它,并在不失去调用它的机会的情况下隐藏它return 正确的值。

通常我这样做是为了 类:

<EditorBrowsable(EditorBrowsableState.Never)>
Public Shadows Function Equals(ByVal obj As Object) As Boolean
    Return MyBase.Equals(obj)
End Function

这对于结构:

<EditorBrowsable(EditorBrowsableState.Never)>
Public Shadows Function Equals(ByVal obj As Object) As Boolean
    Return Object.Equals(obj, Me)
End Function

我在尝试用模块重现此行为时发现的问题是我应该用来填充下面示例中的询问参数,因为我不能使用 Me、模块名称或一个构造函数,我明白了,但是我需要使用什么?

Module TestModule

    <EditorBrowsable(EditorBrowsableState.Never)>
    Public Function Equals(ByVal obj As Object) As Boolean
        Return Object.Equals(obj, ?)
    End Function

End Module

这是有规则的……只是你不能。

您只能在 class 级别使用 Shadows。这意味着 Shadows 元素的声明上下文必须是 class,不能是源文件、命名空间、接口、模块、结构或过程。

这就是为什么您可以在结构中 class...

请多看here。在底部它说明了阴影可以存在的上下文。

编辑 - 解决方案

当您可以使用标准 创建时,不确定为什么要调用 Object.Equals你自己的函数来确定两个对象是否相等。

这是一个简单的解决方案,您可以使用它 尝试和测试。此外,如果你想对许多对象使用 Equals,那么你将需要有更多的结构来比较你要比较的对象,这会影响 Equals 函数。

Module TestModule


    Sub Main()
        Dim a As New Person("Stack", "Overflow")
        Dim b As New Person("Stack", "Overflow")

        Console.WriteLine(a.Equals(b))

    End Sub

    Public Structure Person
        Private FirstName As String
        Private LastName As String

        Public Sub New(firstName As String, lastName As String)
            Me.FirstName = firstName
            Me.LastName = lastName
        End Sub

        <EditorBrowsable(EditorBrowsableState.Never)>
        Public Shadows Function Equals(ByVal obj As Object) As String
            Return If(Object.Equals(obj, Me), "TRUE", "FALSE").ToString
        End Function
    End Structure

End Module

现在你当然可能想知道为什么 Equals return 是 String,我故意这样做是为了让你看到它确实遮蔽了基数 class因为我 return 是另一种类型,否则你不能。您可以将该函数更改为 return a Boolean 并更改 return 并且它工作得很好。

这个在 Object 中定义的函数似乎是您要隐藏的函数:

Public Overridable Function Equals (obj As Object) As Boolean

然而,这在模块中不存在。 "Equals" 您在模块名称后看到的 Intellisense 建议是共享的:

Public Shared Function Equals (objA As Object, objB As Object) As Boolean

您可以在 documentation 中看到它们单独列出。要停止 Intellisense 建议,只需将其包含在您的模块中:

<EditorBrowsable(EditorBrowsableState.Never)> _
Public Function Equals(objA As Object, objB As Object) As Boolean
    Return Object.Equals(objA, objB)
End Function

虽然设计不是很好