Как скрыть метод 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
и изменить возврат, и это работает просто отлично.