一、背景编程
我:虽然经过继承减小了代码冗余,可是,每个子类的构造函数仍是须要给全部属性赋值的,很麻烦的。ide
师:这个好办,用base就行啦。函数
我:贝司?还吉他呢!ui
师:别急,首先咱们先介绍下实例化子类对象的时候调用父类构造函数。spa
运行结果:code
从上面代码分析可知:对象
(1)执行 ChildClass child=new ChildClass(); 会首先调用父类无参构造函数(这个构造函数必定是无参构造函数),而后再调用子类无参构造函数,因此会先显示blog
(2)而后再执行child.SayHello(); 由于子类是继承父类的,因此直接调用父类的SayHello()方法,因此显示继承
总结一下:开发
在实例化子类对象的时候,老是要调用父类的构造函数,而且老是调用无参构造函数。若是父类没有无参构造函数,那么子类的构造函数就会报错
也就说说,子类是很是认死理的。必须去调用父类无参构造函数。这也是编程中容易出错的地方。父类没有编写无参构造函数,致使子类没法编译。
这时候解决错误有两种方法:
(1)直接手动编写父类无参构造函数
(2)在子类构造函数中使用base调用父类中的其余构造函数。Base后面括号中的实际参数须要与被调用的父类构造函数参数保持一致。
二、Base的用法
base其实最大的使用地方在面相对象开发的多态性上,base能够完成建立派生类实例时调用其基类构造函数或者调用基类上已被其余方法重写的方法。
Base有两个用途
(1)在派生类中调用基类构造函数
(2)在派生类中调用基类的方法
2.1关于base调用基类构造函数
public class A { public A() { Console.WriteLine("Build A"); } } public class B:A { public B():base() { Console.WriteLine("Build B"); } static void Main() { B b = new B(); Console.ReadLine(); } }
输出:
base调用基类有参构造和无参构造均可以的哦。
class B:A { public B():base() { Console.WriteLine("Build B"); } public B(string name) : base() { Console.WriteLine(name + "Build B(有参构造)"); } /* public B(string name) : base(name) { Console.WriteLine(name + "Build B(有参构造)"); } //*/ public override void Hello() { base.Hello();//调用基类的方法 Console.WriteLine("Hello,我是 B"); } } class A { public A() { Console.WriteLine("Build A"); } public A(string name) { Console.WriteLine(name+"Build A(有参构造)"); } public virtual void Hello() { Console.WriteLine("Hello,我是A"); } }
static void Main(string[] args) { B b = new B("祥子"); Console.ReadLine(); }
运行结果:
2.2关于base在派生类中调用基类的方法。
public class A { public virtual void Hello() { Console.WriteLine("Hello"); } } public class B : A { public override void Hello() { base.Hello();//调用基类的方法,显示Hello Console.WriteLine("World"); } }
这样若是程序调用B.Hello()得到的效果将会使Hello World.