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

Эквивалент MyClass в С#

Рассматривая этот вопрос, комментатор @Jon Egerton отметил, что MyClass было ключевым словом в VB.Net. Никогда не использовал его, я пошел и нашел документация на нем:

Ключевое слово MyClass ведет себя как переменная объекта, относящаяся к текущему экземпляру класса, как первоначально было реализовано. MyClass похож на Me, но все вызовы метода обрабатываются так, как если бы метод был NotOverridable.

Я вижу, как это может быть полезно, в некоторых конкретных сценариях. Я не могу думать о том, как бы вы получили такое же поведение в С#, то есть убедиться, что вызов виртуального метода myMethod фактически вызван в myMethod в текущем классе, а не в производном myMethod (иначе в IL, вызывая call, а не callvirt)?

Возможно, у меня может быть только полный мысленный момент.

4b9b3361

Ответ 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");
    }
}