一、背景編程
我:雖然經過繼承減小了代碼冗餘,可是,每個子類的構造函數仍是須要給全部屬性賦值的,很麻煩的。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.