子类对父类中的属性和字段的改写

Posted sjitlearn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了子类对父类中的属性和字段的改写相关的知识,希望对你有一定的参考价值。

子类对父类中的属性和字段的改写

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

以上是关于子类对父类中的属性和字段的改写的主要内容,如果未能解决你的问题,请参考以下文章

c#如何在父类(或是接口)当中定义一个子类必须要重写的字段(属性)?

第7章 继承

java如何在子类中赋值给父类的变量

探讨 java 的三大特性之一:继承

抽象类接口

7.4面向对象