Эквивалент MyClass в С#
Рассматривая этот вопрос, комментатор @Jon Egerton отметил, что MyClass
было ключевым словом в VB.Net
. Никогда не использовал его, я пошел и нашел документация на нем:
Ключевое слово MyClass ведет себя как переменная объекта, относящаяся к текущему экземпляру класса, как первоначально было реализовано. MyClass похож на Me, но все вызовы метода обрабатываются так, как если бы метод был NotOverridable.
Я вижу, как это может быть полезно, в некоторых конкретных сценариях. Я не могу думать о том, как бы вы получили такое же поведение в С#, то есть убедиться, что вызов виртуального метода myMethod
фактически вызван в myMethod
в текущем классе, а не в производном myMethod
(иначе в IL, вызывая call
, а не callvirt
)?
Возможно, у меня может быть только полный мысленный момент.
Ответы
Ответ 1
По словам Джона Скита, такого эквивалента нет:
Нет, у С# нет эквивалента ключевого слова VB.NET MyClass. Если вы хотите гарантировать не вызывать переопределенную версию метода, вам необходимо сделать его не виртуальным в первую очередь.
Очевидным обходным решением будет следующее:
public virtual void MyMethod()
{
MyLocalMethod();
}
private void MyLocalMethod()
{
...
}
Затем вы можете вызвать MyLocalMethod()
, когда пользователь VB будет писать MyClass.MyMethod()
.
Ответ 2
В VB.Net нет эквивалента С# ключевого слова MyClass. Чтобы гарантировать, что переопределенная версия метода не будет вызываться, просто сделайте ее не виртуальной.
Ответ 3
В дополнение к ответам, говорящим, что их не существует, вы должны сделать его не виртуальным.
Здесь вонючий (читайте: не делайте этого!) вокруг. Но серьезно, подумайте о своем дизайне.
В основном перемещайте любой метод, который должен иметь базовый, вызываемый в класс super'-base, который находится выше вашего существующего базового класса. В существующем классе call base.Method() всегда вызывается неперекрываемое.
void Main()
{
DerivedClass Instance = new DerivedClass();
Instance.MethodCaller();
}
class InternalBaseClass
{
public InternalBaseClass()
{
}
public virtual void Method()
{
Console.WriteLine("BASE METHOD");
}
}
class BaseClass : InternalBaseClass
{
public BaseClass()
{
}
public void MethodCaller()
{
base.Method();
}
}
class DerivedClass : BaseClass
{
public DerivedClass()
{
}
public override void Method()
{
Console.WriteLine("DERIVED METHOD");
}
}