一直覺得對c#面向對象這塊已經掌握的很好了,因為正常情況下字段一般我們設計成私有的,今天突然想到一個實驗,如下有兩個很簡單的類:
public class Farther { public int a = 100; public virtual int A { get { return a; } } } public class Son : Farther { public new int a = 200; public override int A { get { return a; } } }
注意字段是public的
那么對於下面的輸出你能寫出正確答案嗎?
Son obj = new Son(); var obja = obj as Farther; Farther objb = obj; var objc = (Farther)obj; Console.WriteLine(obj.a); Console.WriteLine(obja.a); Console.WriteLine(objb.a); Console.WriteLine(objc.a); Console.WriteLine(obj.A); Console.WriteLine(obja.A); Console.WriteLine(objb.A); Console.WriteLine(objc.A); Console.ReadKey();
如果我將Son中的override注釋掉那答案是什么?
public class Son : Farther { public new int a = 200; //public override int A //{ // get // { // return a; // } //} }
下面貼答案
未注釋:

已注釋:

結論:無論是字段或是方法或是屬性,加上new 都會在顯示的通過父類訪問時表現為父類的特征,這里方法和屬性我們很常用,但是字段我們可以認為默認是sealed的,即使在子類中不加new也是new一個新的(會彈出一個警告),所以微軟在設計的時候是非常統一的。在這里也回應有些人認為在繼承中父類的字段會完全被覆蓋而消失掉的問題。
本文來自博#客#園
