一直对继承问题有些不清楚,因为要项目开发中用得也不多,所以也就没有深究。最近重新看继承的问题,对派生类中继承甚基类的构造函数问题总有些凝问。在派生类如何隐藏基类中的构造函数。在派生类可以隐藏基类的方法,但好像找不到隐藏基类中构造函数的方法。如果派生类和基类中都有一个无参的构造函数,在对派生类实例化时把基类和派生类的构造函数都执行了。如:
class mybasec
{ public mybasec(int i)
{
Console.WriteLine("这是基类中的有参函数变量名是i,值为{0}", i);
}
}
class myDerivec:mybasec
{
public myDerivec(int i)
{
Console.WriteLine("这是派生类中的有参函数变量名是i,值为{0}", i);
}
}
问题1:程序编译错误,问题是基类中不包含0参数的构造函数,为什么不行。
问题2:在myDerivec myd2 = new myDerivec(6);时不想执行基类中的构造函数,有没有办法把基类中的构造函数隐藏?
第一个问题:这个代码肯定报错,你的基类构造函数要求一个参数。你继承以后,它照样要求一个参数。而你在子类的构造函数中,并没有这么做,那么它肯定要报错,原因是你没有为基类的构造函数传递参数。
public mybasec(int i)
{
Console.WriteLine("这是基类中的有参函数变量名是i,值为{0}", i);
}
第二个问题: 没有办法隐藏,但是你可以重载,在基类中增加如下代码
public mybasec()
{
Console.WriteLine("这是基类中的有参函数变量名是i,值为{0}", i);
}
现在就不会在出现问题了。
基类的构造函数不执行,意味着没有创建基类的实例,那么派生类怎么去访问基类的实例属性?所以CLR的设定,还是需要在实例化派生类的时候,先实例化基类的。
第一个问题,子类实例化时一定会调用基类的构造函数,因为基类也一样要被实例化,默认是调用无参的构造函数,而你这里没有,所有这里会报错。当然你也可以手工指定调用哪个基类的构造函数,如:
public myDerivec(int i):base(i),这样指明后上面的程序就不会报错了。
第二个问题,如楼上所说,做不到。