C#构造函数
说起构造函数,我们都知道是在实例化对象时,用于做一些初始化的操作,今天总结的是,在继承关系下的构造函数的执行关系,时间太长感觉拿捏不准了,好记性不如烂笔头,直接开始。
1.如果当前类存在继承关系,只要申明子类,就会把父类构造函数执行一遍。
class Animal {
public Animal()
{
Debug.Log("animal构造函数");
}
}
class Dog:Animal {
public Dog()
{
Debug.Log("dog构造函数");
}
public void dogFun()
{
Debug.Log("dogFun");
}
}
class JMDog : Dog {
public JMDog() {
Debug.Log("金毛狗的构造方法");
}
}
//调用
void Start()
{
JMDog jmDog=new JMDog();
}
2.当子类中是有参
的构造函数,还是执行了父类无参构造函数。 当执行父类的构造函数时,默认时执行父类的无参构造
class Animal {
public Animal()
{
Debug.Log("animal的无参构造");
}
public Animal(string str)
{
Debug.Log("animal有参构造函数");
}
}
class Dog:Animal {
public Dog(string str)
{
Debug.Log("dog构造函数"+str);
}
public void dogFun()
{
Debug.Log("dogFun");
}
}
3.如果父类中没有无参构造函数,是一个有参数的构造呢?(如果没有声明无参构造函数,有参构造函数会默认顶掉无参构造)
这种情况下子类中的构造函数会报错,这里父类中的有参构造函数顶掉了无参构造,声明子类时默认执行的是父类的无参构造函数,这里将父类中的无参构造手动实现就不会报错了。也可以在子类中使用base关键字,重新指向执行父类的哪个构造函数,并传入对象的参数即可。
使用base关键字
base关键字和this关键字在继承中的用法(简单提一下):
base
用于代表父类,调用父类的构造this
用于代表子类,调用子类的构造
class Animal {
public Animal()
{
Debug.Log("animal的无参构造");
}
public Animal(int i)
{
Debug.Log("animal打印的i值为:"+i);
}
}
class Dog:Animal {
public Dog(int i):base(i) //base用于调用父类的构造
{
Debug.Log("打印的i值为:"+i);
}
public Dog(int i,string str):this(i) //this调用本类的构造
{
Debug.Log("打印的字符: " + str);
}
public void dogFun()
{
Debug.Log("dogFun");
}
}
总结:
- 不手动声明构造函数时,默认编译器会给我们构造一个无参构造函数。
- 不手动声明构造函数时,声明
有参
的构造函数会顶掉无参
构造函数。 - 在继承关系中,申明子类对象时,会默认执行父类的
无参
构造函数。 - 可以使用base关键字重新指定执行父类的哪一个构造函数。