2012-11-01 62 views
3

對於我來說,儘管所有的文檔都存在,但我從來沒有理解過「方法隱藏」。隱藏方法和「新」關鍵字

覆蓋意味着在派生類中使用實現。我是否認爲隱藏(通過使用「新」關鍵字「)將意味着使用基類定義?在這種情況下,爲什麼要在繼承類中編寫方法?

我的2個問題是:

  1. 躲在覆蓋相反
  2. 什麼新的關鍵字(隱藏)以及何時做/被它用在基類繼承的類
  3. ????任何有用的現實世界的例子?

回答

15

你的理解有點偏離。

首先,覆蓋方法意味着即使當實例被強制轉換爲其基類型時,也會使用新的實現,因爲虛方法表中有適當的條目。

隱藏方法時,當實例被強制轉換爲其基類型時,將使用基本實現,因爲虛方法表中沒有條目。

給出下面的類定義:

public class Base 
{ 
    public virtual void Say() 
    { 
     Console.WriteLine("Hello World!"); 
    } 
} 

public class A : Base 
{ 
    public new void Say() 
    { 
     Console.WriteLine("42"); 
    } 
} 

public class B : Base 
{ 
    public override void Say() 
    { 
     Console.WriteLine("Goodbye, Cruel World!"); 
    } 
} 

下面的代碼會產生:

var a = new A(); 
var b = new B(); 
var aAsBase = a as Base; 
var bAsBase = b as Base; 

a.Say(); // 42 
aAsBase.Say(); // Hello World! 

b.Say(); // Goodbye, Cruel World! 
bAsBase.Say(); // Goodbye, CruelWorld! 
+0

+1尼斯解釋。 – Fenton

+0

第二行代碼片段第四行的錯字:'var bAsBase = b as Base; //不是' – vlad

+0

@vlad - 修正。謝謝。 –