Принудительный вызов виртуального метода базового класса внутри базового класса - PullRequest
0 голосов
/ 26 декабря 2018

Не поймите меня неправильно: я не хочу заставлять переопределяющий метод вызывать базовый класс, как это уже просили 1000 раз ...)

Интересно,есть какой-либо способ принудительно вызвать реализацию метода базового класса внутри базового класса.

Пример:

using System;

public class Program
{
    public static void Main()
    {
        var c = new SubClass();
        c.CallInfo();
    }

    internal class BaseClass {
        protected virtual void Info(){
            Console.WriteLine("BaseClass");
        }

        internal virtual void CallInfo() {
            this.Info();
        }
    }

    internal class SubClass : BaseClass {
        protected override void Info() {
            Console.WriteLine("SubClass");
        }

        internal override void CallInfo() {
            base.CallInfo();
        }
    }
}

Вывод, очевидно, будет SubClass.Есть ли способ заставить CallInfo метод BaseClass вызвать собственный метод Info, чтобы результат был BaseClass?

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Помечая ваш метод Info() как virtual, вы специально запрашиваете этот тип наследования.

Если вы хотите убедиться, что вызов метода в вашем базовом классе не переопределен,вам нужно использовать не виртуальный метод, например,

internal class BaseClass {
    protected virtual void Info(){
        this.FinalInfo();
    }

    protected void FinalInfo() {
        Console.WriteLine("BaseClass");
    }

    internal virtual void CallInfo() {
        this.FinalInfo();
    }
}
0 голосов
/ 26 декабря 2018

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

Если это вызывает проблемы, то метод, который вы хотите запустить, не должен быть виртуальным методом.

Это сработает, хотя оно не будет форсировать реализацию подклассом вроде виртуального, оно позволит вам переопределить его.

public class Program
{
    public static void Main()
    {
        var c = new SubClass();
        c.CallInfo();
    }

    internal class BaseClass
    {
        protected void Info()
        {
            Console.WriteLine("BaseClass");
        }

        internal virtual void CallInfo()
        {
            this.Info();
        }
    }

    internal class SubClass : BaseClass
    {  
        protected new void Info()
        {
            Console.WriteLine("SubClass");
        }

        internal override void CallInfo()
        {
            base.CallInfo();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...