В каких сценариях будут использоваться ключевые слова MyBase
и MyClass
в VB.NET?
Использование MyBase и MyClass в VB.NET
Ответ 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
, но все же хотите использовать это поведение по умолчанию для механизмов в родительском классе.