不要误会我的意思:我不想像以前已经问过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
?
答案 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();
}
}
}