对于构造方法的继承需要注意2点:
- 初始化一个对象时,基类base class的构造方法总是会首先执行
- 基类base class的有参构造方法不会被继承,在派生类中需要我们重新定义新的构造方法
实验1
比如说现在有一个Staff类(员工类),有一个默认的构造方法,这个默认方法只输出一个语句。
然后再创建一个Manager类(经理类),继承Staff类(员工类),而Manager类(经理类)继承自Staff类,在csharp中,类的继承需使用冒号连接基类的名称。同样地,Manager类也创建一个默认的构造方法,只输出一个语句。
public class Staff
{
public Staff()
{
Console.WriteLine("员工类初始化");
}
}
public class Manager : Staff
{
public Manager()
{
Console.WriteLine("经理类初始化");
}
}
然后在main方法中实例化Manager类,然后运行代码
static void Main(string[] args)
{
Manager manager = new Manager();
Console.Read();
}
这时候将打印出
输出结果表明,当我们在创建Manager对象的时候,作为派生类,它不仅了调用自己的构建方法,还会在调用自己的构造方法之前先调用基类,也就是Staff类的构造方法。所以,从对象初始化的角度上来说,我们都会首先调用基类的构造方法、然后再一层一层调用派生类的构造方法。
实验2
接下来,为Staff类添加一个公有属性:员工编号。同时呢,我们初始化Staff类时除了有默认的构造方法外,还有一个带参数的构造方法:
public class Staff
{
public Staff()
{
Console.WriteLine("员工类初始化");
}
public int Number { get; set; }
public Staff(int number)
{
Number = number;
}
}
然后在Manager类中也添加一个带参数的构造方法:
public class Manager : Staff
{
public Manager()
{
Console.WriteLine("经理类初始化");
}
public Manager(int number)
{
Console.WriteLine($"{number} - 经理类初始化");
}
}
完整的代码如下:
class Program
{
public class Staff
{
public Staff()
{
Console.WriteLine("员工类初始化");
}
public int Number { get; set; }
public Staff(int number)
{
Number = number;
}
}
public class Manager : Staff
{
public Manager()
{
Console.WriteLine("经理类初始化");
}
public Manager(int number)
{
Console.WriteLine($"{number} - 经理类初始化");
}
}
static void Main(string[] args)
{
Manager manager = new Manager(800);
Console.WriteLine(manager.Number);//输出0
Console.Read();
}
}
这时候打印出
为什么manager对象的编号是0呢?一般来说整数对象没有赋值的时候才会是0,所以这就说明构造方法根本没有对Manager类的员工编号赋值。
输入的第一行是实际是从Staff类的默认午餐构造方法中产生的。这就说明,虽然我们在初始化Manager对象的时候使用了参数,但是在调用继承构造方法的时候,并不是按我们预想的那样调用Staff类有参数的构造方法,而是调用了无参数的默认构造方法。
实际上,如果一个类存在多个构造方法,那么在派生类处理继承的时候就面临着多个构造方法选择的问题。在默认情况下,无论基类有多少个构造方法,他的派生类在创建对象的时候都会默认使用默认无参数构造方法执行继承工作。所以,这就是为什么manager对象的赋值会失败。
对于基类拥有多个构造方法的时候,派生类如何选择才能在继承过程中顺利处理我们需要的初始化方法呢?这个时候我们就需要使用base关键词了。
base解释:
base就是基础、代表的就是基类
- 使用 base 关键字可以从派生类中访问基类的成员:
- 指定创建派生类实例时应调用的基类构造函数。
- 仅允许基类访问在构造函数、实例方法或实例属性访问器中进行。
- 注意:静态方法中不能使用 base 关键字。
将代码调整一下,再运行,manager对象的编号就为800了
class Program
{
public class Staff
{
public Staff()
{
Console.WriteLine("员工类初始化");
}
public int Number { get; set; }
public Staff(int number)
{
Number = number;
}
}
public class Manager : Staff
{
public Manager()
{
Console.WriteLine("经理类初始化");
}
public Manager(int number) : base(number)
{
Console.WriteLine($"{number} - 经理类初始化");
}
}
static void Main(string[] args)
{
Manager manager = new Manager(800);
Console.WriteLine(manager.Number);//输出0
Console.Read();
}
}
以上
标签:初始化,Console,构造方法,Manager,基类,构造函数,public,Staff From: https://www.cnblogs.com/ynysj/p/16995333.html