Как скрыть метод Object.Equals() в модуле?

Возможно, заголовок вопроса не является правильным, потому что методы в модуле не могут быть скрыты, но по сути я хочу скрыть базовый элемент, объявляя его снова и скрывая, не теряя возможности вызвать его и вернуть правильное значение,

Обычно я делаю это для классов:

<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

2 ответа

Решение

Эта функция, определенная в Object, похоже, та, которую вы пытаетесь скрыть:

Public Overridable Function Equals (obj As Object) As Boolean

Однако это не существует в модуле. "Равные", которые вы видите, предлагает Intellisense после того, как имя вашего модуля является общим:

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

Вы можете увидеть их в списке отдельно в документации. Чтобы Intellisense не предлагал его, просто включите его в свой модуль:

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

Это не кажется хорошим дизайном, хотя

Есть правила для этого... и просто вы не можете.

Ты можешь использовать Shadows только на уровне класса. Это означает, что контекст объявления для элемента Shadows должен быть классом, не может быть исходным файлом, пространством имен, интерфейсом, модулем, структурой или процедурой.

Вот почему вы можете в структуре и классе...

Пожалуйста, смотрите больше здесь. Внизу указано, в каком контексте могут существовать тени.

Редактировать - Решение

Не уверен, почему вы хотели бы вызвать 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Я специально сделал это, чтобы вы могли видеть, что он затеняет базовый класс, так как я возвращаю другой тип, иначе вы не можете. Вы можете изменить эту функцию, чтобы вернуть Boolean и изменить возврат, и это работает просто отлично.

Другие вопросы по тегам