3
對於我來說,儘管所有的文檔都存在,但我從來沒有理解過「方法隱藏」。隱藏方法和「新」關鍵字
覆蓋意味着在派生類中使用實現。我是否認爲隱藏(通過使用「新」關鍵字「)將意味着使用基類定義?在這種情況下,爲什麼要在繼承類中編寫方法?
我的2個問題是:
- 躲在覆蓋相反
- 什麼新的關鍵字(隱藏)以及何時做/被它用在基類繼承的類
- ????任何有用的現實世界的例子?
對於我來說,儘管所有的文檔都存在,但我從來沒有理解過「方法隱藏」。隱藏方法和「新」關鍵字
覆蓋意味着在派生類中使用實現。我是否認爲隱藏(通過使用「新」關鍵字「)將意味着使用基類定義?在這種情況下,爲什麼要在繼承類中編寫方法?
我的2個問題是:
你的理解有點偏離。
首先,覆蓋方法意味着即使當實例被強制轉換爲其基類型時,也會使用新的實現,因爲虛方法表中有適當的條目。
隱藏方法時,當實例被強制轉換爲其基類型時,將使用基本實現,因爲虛方法表中沒有條目。
給出下面的類定義:
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!
+1尼斯解釋。 – Fenton
第二行代碼片段第四行的錯字:'var bAsBase = b as Base; //不是' – vlad
@vlad - 修正。謝謝。 –