Подтвердить что ты не робот

Использование MyBase и MyClass в VB.NET

В каких сценариях будут использоваться ключевые слова MyBase и MyClass в VB.NET?

4b9b3361

Ответ 1

MyBase используется, когда виртуальная функция должна вызывать версию своих родителей. Например, рассмотрим:

Class Button
    Public Overridable Sub Paint()
        ' Paint button here. '
    End Sub
End Class

Class ButtonWithFancyBanner
    Inherits Button

    Public Overrides Sub Paint()
        ' First, paint the button. '
        MyBase.Paint()
        ' Now, paint the banner. … '
    End Sub
End Class

(Это то же самое, что и base в С#.)


MyClass редко используется вообще. Он вызывает собственный класс, даже если он обычно вызывает виртуальный метод производных классов. Другими словами, он отключает отправку виртуального метода и вместо этого выполняет статический вызов.

Это надуманный пример. Мне трудно найти реальное использование сейчас (хотя это, безусловно, существует):

Class Base
    Public Overridable Sub PrintName()
        Console.WriteLine("I’m Base")
    End Sub

    Public Sub ReallyPrintMyName()
        MyClass.PrintName()
    End Sub
End Class

Class Derived
    Inherits Base
    Public Overrides Sub PrintName()
        Console.WriteLine("I’m Derived")
    End Sub
End Class

' … Usage: '

Dim b As Base = New Derived()
b.PrintName()         ' Prints "I’m Derived" '
b.ReallyPrintMyName() ' Prints "I’m Base" '

(Это не существует в С#. В IL это вызывает call вместо обычного кода операции callvirt.)

Ответ 2

Оба используются, когда вам нужно вызвать виртуальный метод, и вам нужно указать, какой из них. MyBase вызовет метод в базовом классе, MyClass вызовет метод в текущем классе.

Я не думаю, что я использовал MyClass более одного или двух раз, но MyBase Я использовал довольно много, когда переопределяю метод, но хочу, чтобы код в переопределенном методе также выполнялся.

MyBase:

http://msdn.microsoft.com/en-us/library/dzfhkk01%28VS.71%29.aspx

MyClass:

http://msdn.microsoft.com/en-us/library/b3b35kyk%28VS.71%29.aspx

Ответ 3

mybase относится к непосредственному базовому классу текущего экземпляра.

myclass относится к текущему экземпляру, но игнорирует любую переопределенную реализацию свойств/методов класса.

В двух словах общее использование обоих для Polymorphism. Вот хорошая статья которая немного объясняет ключевые слова.

Ответ 4

Что касается использования MyClass, то будет очень небольшое улучшение скорости, если вы используете MyClass внутри класса листа (класс NotInheritable). В частности, если существует какой-либо метод, который существует в родительском классе и не переопределен ИЛИ существует как переопределение в листовом классе, то использование MyClass вместо Me приводит к использованию кода операции call вместо callvirt.

MyBase, который также испускает код операции call, неприменим в этом случае, когда вы хотите, чтобы этот метод вызывался независимо от того, был ли он реализован/переопределен в листе или существует только в родительском элементе. I.e., вы поддерживаете форму согласованности стиля между большим количеством похожих объектов.

И когда я говорю "улучшение скорости", я говорю о ничтожных ~ 5 мс из 100 000 прогонов на низкопроизводительном сервере разработки, работающем в 32-битном режиме, в функции разбора строк. Или заявить об этом по-другому, чем быстрее машина, тем меньше будет эта разница. Но, я хотел поместить его там.

Ответ 5

Эти ключевые слова используются в сценариях, связанных с Inheritence. MyBase, MyClass часто используются для обозначения некоторых функциональных возможностей или свойств родительского класса. Если у вас есть класс, который происходит от другого, эти ключевые слова используются для ссылки на код в контексте родительского класса.

Ответ 6

Оба термина используются в контексте отношения Parent-Child (или Base-Inherited) между двумя классами.

MyBase вызывается из дочернего класса. Вы используете это, когда хотите сослаться на члена родительского класса без двусмысленности. Это полезно, когда в дочернем классе есть член, имя которого также используется в родительском классе (обратите внимание, это означает, что дочерний элемент является либо overloads, либо shadows родительским членом).

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