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

时间:2016-03-22 23:05:14

标签: .net vb.net module equality shadowing

也许问题的标题不合适,因为模块中的方法不能被遮蔽,但实质上我想隐藏一个基础成员再次声明它,并隐藏它而不会失去调用它的机会并返回适当的价值。

通常我会为Classes执行此操作:

<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

我发现尝试使用模块重现此行为的问题是我应该用来填充下面示例中的interrogant参数,因为我不能使用Me,模块名称,或者一个构造函数,我理解它,但我需要使用它吗?。

Module TestModule

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

End Module

2 个答案:

答案 0 :(得分:2)

这有规则......只是你不能。

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

这就是为什么你可以在一个结构和类......

请参阅更多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返回String,我故意这样做,所以你可以看到它确实影响了基类,因为我返回了另一种类型,否则你可&#39;吨。您可以更改该函数以返回Boolean并更改返回,它可以正常工作。

答案 1 :(得分:0)

这个在Object中定义的函数似乎是你想要影响的函数:

Public Overridable Function Equals (obj As Object) As Boolean

然而,这在模块中不存在。在您的模块名称是共享名称后,您看到智能感知的“等于”:

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

虽然

看起来不太好