public class Animal
{
public Animal()
{
"animal ctor".Dump();
}
}
public class Cat :Animal
{
public Cat():this("gray")
{
"cat ctor".Dump();
}
public Cat(string c):base()
{
"cat ctor2".Dump();
}
}
void Main()
{
Cat a = new Cat();
}
代码的输出是:
animal ctor
cat ctor2
cat ctor
我理解第一行。
首先调用Animal Ctor,但然后Cat ctor调用字符串重载public Cat(string c):base()
- 但这也是基本构造函数的调用。
那么为什么我再也看不到animal ctor
(:base()
)?
答案 0 :(得分:5)
构造函数只调用一次:
Cat()
构造函数调用Cat(string c)
Cat(string c)
正在调用 base 构造函数Cat(string c)
(这是基地的来电者)Cat()
构造函数基本上,如果你调用 base 构造函数(或类中的其他构造函数),那么在构造函数之前执行。请参阅documentation以获取更多详细信息
答案 1 :(得分:1)
Cat()
显式调用显式调用Cat(string)
的{{1}}。
这些调用在每个方法启动之前发生,因此您会看到它们以相反的顺序转储。
Animal()
不会直接调用Cat()
,这意味着基类的构造函数只会被调用一次(这可能是你想要的)
如果没有明确指定要调用的构造函数,则调用基类的默认构造函数;以下是:
Animal()
相当于:
public Cat(string c) :base()
{
"cat ctor2".Dump();
}
答案 2 :(得分:0)
有一些继承和对象构造规则。
这里,构造函数按顺序调用Cat():this(string)是Cat(string):base()是Animal()
动物是猫的基础,所以首先构建动物。一旦Animal()构造函数调用完成,那么Cat(字符串)将完成,随后将完成Cat()调用。
即使你没有提到base(),仍然会调用base。默认情况下始终调用无参数构造函数(如果可用),并将此过程冒泡到层次结构中最顶层的父级。
每个类始终存在无参数构造函数。但是,如果您使用参数声明一个,那么您明确需要声明一个无参数构造函数。