子類對父類中的屬性和字段的改寫
剛開始聽老師講,字段要用private來修飾,屬性用public來修飾,通過屬性來控制字段,字段存儲數據。
那為什么要用private來修飾字段呢???
原因:防止外部人員通過子類來改寫父類中的屬性以及字段,從而破壞了項目的初衷,造成嚴重的后果。
例子:
父類及成員:
class Bea { public Bea(int age,string name) { this.Name = name; this.Age = age; } public int _age; //對年齡屬性的改寫 public virtual int Age { get { return _age; } set { if (value >= 15 && value <= 20) { _age = value; } else { _age = 0; } } } public string _name; public string Name { get { return _name; } set { _name = value; } } }
子類及成員:
1 class Green:Bea 2 { 3 public Green(string a,int b):base(b,a) 4 { 5 } 6 //對父類中的Age屬性的改寫 7 public override int Age 8 { 9 get { return _age; } 10 set 11 { 12 if (value >= 18 && value <= 400) 13 { 14 _age = value; 15 } 16 else 17 { 18 _age = 0; 19 } 20 } 21 } 22 }
接下來在main方法中輸出父類中的成員Age
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Bea father = new Green("danger",300);//將子類對象賦值給父類 6 Console.WriteLine(father.Age); 7 Console.ReadKey(); 8 } 9 }
結果:300
原因: 實例father對象的時候,首先會調用父類的構造函數,當給父類中的屬性Age賦值時,由於子類對父類中該屬性重寫,因此程序會跳過給父類中的屬性Age賦值
,轉而直接跳到子類中對屬性的改寫里面,這就解釋了,結果是300而不是0.
結論:在正常的項目中,我們會對字段做保護處理(private),防止外部人員通過子類來改寫父類中的成員,造成嚴重后果。