派生类的构造方法

本文解析了在类层次结构中构造函数的定义与使用方式,重点介绍了默认构造函数与带参数构造函数的区别,以及如何正确地在派生类中调用基类的构造函数。

 

如果没有显示的为类定义任何构造函数,编译器就会为类定义默认的构造函数,反过来,如果为类定义的任何构造函数,编译器都不会再定义默认的构造函数。

 

如果在一个层次的类中,没有为类定义任何构造函数,那么在实例化一个类时,编译器解决这些层次结构的构造问题顺序是这样的:

首先 编译器找到要实例化的类的构造函数,这个构造函数再找到其直接基类的构造函数,这个直接基类的构造函数再找到他的直接基类的构造函数。。。。。。。一直找到Object类为止,因为Object没有基类了,这样就执行Object的构造函数,执行完后返回,再执行其直接子类的构造函数,执行完再返回。。。。。。这样就像现今政府机构下达命令一样,一层层下发,直到实例化那个类为止。因为从头到尾调用的都是编译器生成的构造函数(称为默认构造函数),所以整个过程都是编译器在忙。

 

如果我在这个层次的类中手动为一个类添加了一个无参数的构造的话,(因为编译器不会去生成默认的构造函数了) ,编译器做的工作和上面一样,层层上报,再层层下发,只不过用我的构造函数替换了编译器的默认构造函数而已。

 

如果我在这个层次的类中手动为一个类添加了一个带参数的构造函数的话,(编译器同样不会去生成默认的构造函数,好像只要你侵犯他的构造领域,他就不去管了),这样编译时当然会报错。 因为其下层构造函数要在这里找一个无参数的构造函数发现找不到了。怎么办?

指定派生类在基类中查找的构造函数

 

    class a
    {
        public string name;
        //public a()
        //{
        //    name = "调用了无参数的构造";
        //    Console.WriteLine(name);
        //}
        public a(int i)
        {
            name = "调用了有参数的构造"+"/t"+i;
            Console.WriteLine(name);
        }
    }

    class b : a
    {
        public decimal salary;
        public b():base(3)
        {
            salary = 5000;
        }
    }

 

 

在PTA环境下编写派生类构造方法,可参考以下要点与示例。 ### 调用基类构造方法 编写派生类构造方法时,通常需调用基类的构造方法来初始化从基类继承的数据成员。在Python里,可使用`super()`函数或`基类名.__init__()`来达成。 #### 使用`super()`函数调用基类构造方法 ```python class Person: def __init__(self, name, age): self.name = name self.age = age class Student(Person): def __init__(self, name, age, student_id): super().__init__(name, age) self.student_id = student_id # 在PTA中可能的测试代码调用示例 student = Student("Alice", 20, "12345") print(student.name) print(student.age) print(student.student_id) ``` #### 使用`基类名.__init__()`调用基类构造方法 ```python class Person: def __init__(self, name, age): self.name = name self.age = age class Student(Person): def __init__(self, name, age, student_id): Person.__init__(self, name, age) self.student_id = student_id # 在PTA中可能的测试代码调用示例 student = Student("Alice", 20, "12345") print(student.name) print(student.age) print(student.student_id) ``` ### 考虑基类构造方法的参数 编写派生类构造方法时,要留意基类构造方法所需的参数,保证在调用基类构造方法时传入正确的参数。 ### 处理派生类特有的数据成员 除调用基类构造方法初始化继承的数据成员外,还需在派生类构造方法里初始化派生类特有的数据成员。 ### 示例 ```python class Animal: def __init__(self, name): self.name = name class Dog(Animal): def __init__(self, name, breed): super().__init__(name) self.breed = breed # 在PTA中可能的测试代码调用示例 dog = Dog("Buddy", "Golden Retriever") print(dog.name) print(dog.breed) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值