子类对父类中的属性和字段的改写
子类对父类中的属性和字段的改写
刚开始听老师讲,字段要用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),防止外部人员通过子类来改写父类中的成员,造成严重后果。