深入剖析C#繼承機制3

三. 訪問與隱藏基類成員

  (1) 訪問基類成員

  通過base 關鍵字訪問基類的成員:

   調用基類上已被其他方法重寫的方法。
   指定創建派生類實例時應調用的基類構造函數。
   基類訪問只能在構造函數、實例方法或實例屬性訪問器中進行。
   從靜態方法中使用 base 關鍵字是錯誤的。

  示例:下面程序中基類 Person 和派生類 Employee 都有一個名爲 Getinfo 的方法。通過使用 base 關鍵字,可以從派生類中調用基類上的 Getinfo 方法。

using System ;
public class Person
{
protected string ssn = "111-222-333-444" ;
protected string name = "張三" ;
public virtual void GetInfo() {
Console.WriteLine("姓名: {0}", name) ;
Console.WriteLine("編號: {0}", ssn) ;
}
}
class Employee: Person
{
public string id = "ABC567EFG23267" ;
public override void GetInfo() {
// 調用基類的GetInfo方法:
base.GetInfo();
Console.WriteLine("成員ID: {0}", id) ;
}
}
class TestClass {
public static void Main() {
Employee E = new Employee() ;
E.GetInfo() ;
}
}

  程序運行輸出:

   姓名: 張三
   編號: 111-222-333-444
   成員ID: ABC567EFG23267
   示例:派生類同基類進行通信。

using System ;
public class Parent
{
string parentString;
public Parent( )
{ Console.WriteLine("Parent Constructor.") ; }
public Parent(string myString) {
parentString = myString;
Console.WriteLine(parentString) ;
}
public void print( )
{ Console.WriteLine("I'm a Parent Class.") ; }
}
public class Child : Parent
{
public Child( ) : base("From Derived")
{ Console.WriteLine("Child Constructor.") ; }
public void print( ) {
base.print( ) ;
Console.WriteLine("I'm a Child Class.") ;
}
public static void Main( ) {
Child child = new Child( ) ;
child.print( ) ;
((Parent)child).print( ) ;
}
}

  程序運行輸出:

From Derived
Child Constructor.
I'm a Parent Class.
I'm a Child Class.
I'm a Parent Class.

  說明:

  1.派生類在初始化的過程中可以同基類進行通信。

  上面代碼演示了在子類的構造函數定義中是如何實現同基類通信的。分號":"和關鍵字base用來調用帶有相應參數的基類的構造函數。輸出結果中,第一行表明:基類的構造函數最先被調用,其實在參數是字符串"From Derived"。

  2.有時,對於基類已有定義的方法,打算重新定義自己的實現。

  Child類可以自己重新定義print( )方法的實現。Child的print( )方法覆蓋了Parent中的 print 方法。結果是:除非經過特別指明,Parent類中的print方法不會被調用。

  3.在Child類的 print( ) 方法中,我們特別指明:調用的是Parent類中的 print( ) 方法。

  方法名前面爲"base",一旦使用"base"關鍵字之後,你就可以訪問基類的具有公有或者保護權限的成員。 Child類中的print( )方法的執行結果出現上面的第三行和第四行。

  4.訪問基類成員的另外一種方法是:通過顯式類型轉換。

  在Child類的Main( )方法中的最後一條語句就是這麼做的。記住:派生類是其基類的特例。這個事實告訴我們:可以在派生類中進行數據類型的轉換,使其成爲基類的一個實例。上面代碼的最後一行實際上執行了Parent類中的 print( )方法。

發佈了29 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章