先定义两个类
public class A { protected void fun1() { fun2(); } protected virtual void fun2() { Console.WriteLine("A.fun2"); } } public class B : A { public void Test() { base.fun1(); } protected void fun2() { Console.WriteLine("B.fun2"); } } public class Program { public static void Main(string[] args) { // CreateHostBuilder(args).Build().Run(); B model = new B(); model.Test(); }
客官可猜输出是什么?
答案: A.fun2
然而我们修改一下class.B的代码
protected new void fun2() { Console.WriteLine("B.fun2"); }
增加 new 关键词,覆盖 A的fun2
然而输出的结果还是 A.fun2
protected override void fun2() { Console.WriteLine("B.fun2"); }
客官可猜输出是什么? B.fun2
如果在java中,我们第一次的代码就直接输出 B.fun2 ,因为 java 中同名方法会重写 父类方法,但是C# 中必须明确的用虚方法和 override关键词来重写父类方法
我们再次改一下class.B的代码
public class B : A { public void fun1() { base.fun1(); } public void fun2() { Console.WriteLine("B.fun2"); } } public class Program { public static void Main(string[] args) { // CreateHostBuilder(args).Build().Run(); A model = new B(); model.fun1(); }
改动的地方我给加粗了,词时输出的是什么?依然是 A.fun2
再改 ,输出 B.fun2
再改
public class B : A { public void fun1() { fun1(); } public void fun2() { Console.WriteLine("B.fun2"); } }
输出 A.fun2
改
public class B : A { public void fun1() { fun1(); } public override void fun2() { Console.WriteLine("B.fun2"); } }
输出 B.fun2
得出一个结论,当子类重写了父类的方法后,当子类代替父类出现时都将使用子类的 方法,而不使用自己父类的方法