先定義兩個類
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
得出一個結論,當子類重寫了父類的方法後,當子類代替父類出現時都將使用子類的 方法,而不使用自己父類的方法