一直以爲對c#面向對象這塊已經掌握的很好了,由於正常狀況下字段通常咱們設計成私有的,今天忽然想到一個實驗,以下有兩個很簡單的類: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的ide
那麼對於下面的輸出你能寫出正確答案嗎?spa
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; // } //} }
下面貼答案code
未註釋:對象
已註釋:blog
結論:不管是字段或是方法或是屬性,加上new 都會在顯示的經過父類訪問時表現爲父類的特徵,這裏方法和屬性咱們很經常使用,可是字段咱們能夠認爲默認是sealed的,即便在子類中不加new也是new一個新的(會彈出一個警告),因此微軟在設計的時候是很是統一的。在這裏也迴應有些人認爲在繼承中父類的字段會徹底被覆蓋而消失掉的問題。繼承
本文來自博#客#園get