强制在基类内部调用基类虚拟方法

时间:2018-12-25 22:00:52

标签: c# .net oop inheritance

不要误会我的意思:我不想像以前已经问过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的{​​{1}}方法调用其自己的BaseClass方法,以使输出为Info

2 个答案:

答案 0 :(得分:4)

通过将您的Info()方法标记为virtual,您特别要求发生这种继承行为。

如果要确保基类中的方法调用不被覆盖,则需要使用非虚拟方法,例如

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

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

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

答案 1 :(得分:1)

不,您不能那样做。虚拟方法的目的是派生类可以覆盖实现,并且即使从基类调用实现也可以使用实现。

如果这会导致问题,则您要运行的方法不应是虚拟方法。

这是可行的,尽管它不会通过像virtual这样的子类强制实现,但可以覆盖它。

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();
        }
    }
}