zoukankan      html  css  js  c++  java
  • 子类对父类中的属性和字段的改写

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

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

  • 相关阅读:
    51nod1089(最长回文子串之manacher算法)
    51nod1088(最长回文子串)
    51nod1256(乘法逆元)
    51nod1085(01背包)
    51nod1079(中国剩余定理)
    数据的特征工程
    30种提高mysql处理速度的方法
    机器学习资料
    python3.6安装-windows
    python import sklearn出错 "ImportError: DLL load failed: 找不到指定的模块。
  • 原文地址:https://www.cnblogs.com/sjitLearn/p/8994731.html
Copyright © 2011-2022 走看看