• 继承中的构造函数问题


    代码如下:

     1 class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             Teacher t1 = new Teacher("许大虾", 23, "byvar1024@163.com", 10000);
     6             Student s1 = new Student("许大虾", 23, "byvar1024@163.com", "100001");
     7         }
     8         
     9     }
    10  class Person//基类
    11     {
    12 
    13         public Person(string name,int age,string email)
    14         {
    15             
    16             this.Name = name;
    17             this.Age = age;
    18             this.Email = email;
    19         }
    20         public string Name { get; set; }
    21         public int Age { get; set; }
    22         public string Email { get; set; }
    23     }
    24     class Teacher : Person //派生类
    25     {
    28         public Teacher(string name, int age, string email,double salary)
    29         {
    30             this.Name = name;
    31             this.Age = age;
    32             this.Email = email;
    33             this.Salary = salary;
    34         }
    35         public double Salary { get; set; }
    36     }
    37     class Student : Person//派生类
    38     {
    39         public Student(string name, int age, string email,string sno)
    40         {
    41             this.Name = name;
    42             this.Age = age;
    43             this.Email = email;
    44             this.SNo = sno;
    45         }
    46         public string SNo { get; set; }
    47     }

    创建了Person父类,再让Student[子类]和Teacher[子类]继承Person类,同时分别在两个子类中各自添加一个构造函数。这时在父类也添加一个有参数的构造函数。编译生成后,发现产生了如下错误:

    问题分析:

    1.构造函数无法被继承

    2.由于在创建子类对象的时候,一定会调用子类的构造函数,而任何一个子类构造函数默认情况下都会去调用父类的无参构造函数,所以当父类中没有无参构造函数时就出错了。

    解决方法:

    a.在父类中增加一个无参构造函数

    b.在子类中指定子类的构造函数调用父类中没有参数的那个构造函数

    代码变更:

    a方案,直接在Person类添加一个无参构造函数

    Public Person(){}

    b方案,在子类中通过base()来指定调用父类[Person]的构造函数

    class Teacher : Person
        {
            public Teacher(string name, int age, string email,double salary)
                :base(name,age,email)
            {
                //this.Name = name;
                //this.Age = age;
                //this.Email = email;
                this.Salary = salary;
            }
            public double Salary { get; set; }
        }

    这里你会发现我把以下代码给注释掉了,原因是刚已经通过base()来手动调用父类的构造函数,而在父类中已经把这三个属性赋值了,所以就没必要再写一遍了

     //this.Name = name;
     //this.Age = age;
     //this.Email = email;

    这里需要注意的执行顺序是先调用父类的构造函数,然后再执行子类自己的构造函数

  • 相关阅读:
    微信小程序开发
    layer 弹出框的使用
    [转]如何把别人项目代码修改后 提交到github
    [转载]Github轻松上手1-Git的工作原理与设置
    [学]git 原理学习
    Dynamics CRM Form表单中通过javascript抓取触发change事件字段的属性名
    技巧:多共享动态库中同名对象重复析构问题的解决方法
    The encryption certificate of the relying party trust identified by thumbprint is not valid
    Cannot start service MSSQL$MICROSOFT##WID on computer
    Hive操作语句实例讲解(帮助你了解 桶 bucket)
  • 原文地址:https://www.cnblogs.com/byvar/p/4301284.html
Copyright © 2020-2023  润新知