C# 繼承的成員

2018-01-16 03:48 更新

C#繼承的成員

隱藏繼承的成員

基類和子類可以定義相同的成員。例如:


public class A { 
   public int Counter = 1; 
} 

public class B : A { 
   public int Counter = 2; 
} 

類B中的計(jì)數(shù)器字段被稱為隱藏類A中的計(jì)數(shù)器字段。

要有意隱藏成員,在這種情況下,您可以將新修飾符應(yīng)用于子類中的成員。

new 修飾符沒有什么比壓制編譯器警告,否則會(huì)導(dǎo)致:


public class A { 
   public int Counter = 1; 
} 
public class B : A { 
   public new int Counter = 2; 
} 

new 修飾符告訴編譯器重復(fù)的成員不是意外。


new和重寫

考慮下面的類層次結(jié)構(gòu):


public class BaseClass {
    public virtual void Foo() { Console.WriteLine ("BaseClass.Foo"); } 
} 
public class Overrider : BaseClass {
    public override void Foo() { Console.WriteLine ("Overrider.Foo"); } 
} 
public class Hider : BaseClass {
    public new void Foo() { Console.WriteLine ("Hider.Foo"); } 
} 

Overrider和Hider之間的行為差??異在下面的代碼中演示:


Overrider over = new Overrider(); 
BaseClass b1 = over; 
over.Foo(); // Overrider.Foo 
b1.Foo();   // Overrider.Foo 


Hider h = new Hider(); 
BaseClass b2 = h; 
h.Foo();  // Hider.Foo 
b2.Foo(); // BaseClass.Foo 

封裝函數(shù)和類

被覆蓋的功能成員可以用封裝的關(guān)鍵字來(lái)封裝其實(shí)現(xiàn),以防止被覆蓋。


public sealed override decimal FinalPrice { 
   get { 
      return Price; 
   }
} 

你還可以封裝類本身,隱式地封裝所有的虛函數(shù),通過應(yīng)用封裝修飾符到類本身。

基本關(guān)鍵字

base關(guān)鍵字與this關(guān)鍵字類似。

它有兩個(gè)基本用途:

  • 從子類訪問重寫的函數(shù)成員
  • 調(diào)用基類構(gòu)造函數(shù)

public class DiscountProduct : Item {
     ...
     public override decimal FinalPrice {
         get { 
            return base.FinalPrice + Price; 
         }
     } 
} 

使用base關(guān)鍵字,我們無(wú)條件地訪問Item的FinalPrice屬性。

構(gòu)造函數(shù)和繼承

子類必須聲明自己的構(gòu)造函數(shù)。

基類的構(gòu)造函數(shù)可以被派生類訪問,但不會(huì)自動(dòng)繼承。

例如,如果我們定義基本類和子類如下:


public class Baseclass {
   public int X;
   public Baseclass () { }
   public Baseclass (int x) { this.X = x; } 
} 

public class Subclass : Baseclass { } 

以下是非法的:


Subclass s = new Subclass (123); 

子類必須重新定義它想要公開的任何構(gòu)造函數(shù)。

通過這樣做,它可以使用base關(guān)鍵字調(diào)用任何基類的構(gòu)造函數(shù):


public class Subclass : Baseclass {
    public Subclass (int x) : base (x) { } 
} 

base關(guān)鍵字的工作原理類似于this關(guān)鍵字,除了它調(diào)用基類中的構(gòu)造函數(shù)。

如果子類中的構(gòu)造函數(shù)忽略了base關(guān)鍵字,則基類型的無(wú)參構(gòu)造器被隱式調(diào)用:

public class BaseClass { 
   public int X; 
   public BaseClass() { X = 1; } 
} 

public class Subclass : BaseClass { 
   public Subclass() { Console.WriteLine (X); } // 1 
} 

如果基類沒有可訪問的無(wú)參數(shù)構(gòu)造函數(shù),則子類必須在其構(gòu)造函數(shù)中使用base關(guān)鍵字。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)