首先需要明确的是,无论是基类还是派生类,想要携带特定参量实例化对象,都需要存在一个相对应的构造函数。尤其是对于一个派生类来说,即是说基类里面已经有了携带了所需参量的构造函数,但他只是基类的构造函数,派生类并不可以直接拿过来用。
另外,对于派生类中base和this的使用,也算是痛的领悟,琢磨试验了好一会儿才搞明白了。不论是使用base还是this,他们的目的都在于保持或者扩展他们所引用的构造函数,所以说,原构造函数所携带的形参,不论是base还是this,它们也都需要携带齐全,最起码要等于,如果是做扩展可以多于,但是一定要包含原构造函数所携带的参量,否则会报错。如果不携带,也有解决方法,那就是具体写入参数,当然了,这样做也是特殊情况,说明你们运用环境已经不需要动态变化的参量了,你只需要固定好参数就行了,省的用到构造函数的时候还要每次都代入相同的参数,麻烦。具体代码实现如下所示,这是没有问题的代码。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace build_function
{
class Program
{
static void Main(string[] args)
{
dog gou = new dog(10,"ade");
}
}
class pet
{
public pet() { }
public pet(string name) { }
public pet(int age, string name) { }
#if false
public pet(string name, int age) : this(age,name)
{
}
#endif
}
class dog : pet
{
#if true
public dog(string name):base(name)
{
}
#endif
#if false
public dog(string name)
{
}
#endif
#if true
public dog(int age, string name):base(age,name)
{
}
#endif
public dog(string name,int age) : this(name)
{
}
}
}
但是,假如我去掉了base或者this前面的形参会发生什么?情况如下图所示:
没错,他会报错,就像我上面说的那样,一定要包含引用的前一个构造函数的参量才行。或者代入具体参数,如下图所示:
红色波浪就消失了。当然了,两幅图第二个dog的红色波浪不需要在意,因为重名了,现实编写代码中是不会存在这个现象的,我只是为了做好演示。