11.多態
面向對象的語言使用虛方法表達多態。這就意味著派生類可以有和父類具有同樣簽名的方法,並且父類可以調用派生類的方法【譯注:此處應該是對象(或對象引用、指向對象的指針)】。在Java中,缺省情況下方法就是虛的。在C#中,必須使用virtual關鍵字才能使方法被父類調用。
在C#中,還需要override關鍵字以指明一個方法將重載(或實現一個抽象方法)其父類的方法。
Class B file://【譯注:應為class B】
{
public virtual void foo () {}
}
Class D : B file://【譯注:應為class D : B】
{
public override void foo () {}
}
試圖重載一個非虛的方法將會導致一個編譯時錯誤,除非對該方法加上“new”關鍵字,以指明該方法意欲隱藏父類的方法。
Class N : D file://【譯注:應為class N : D】
{
public new void foo () {}
}
N n = new N ();
n.foo(); // 調用N的foo
((D)n).foo(); // 調用D的foo
((B)n).foo(); // 調用D的foo
和C++、Java相比,C#的override關鍵字使得閱讀源代碼時可以清晰地看出哪些方法是重載的。不過,使用虛方法有利有弊。第一個有利點是:避免使用虛方法輕微的提高了執行速度。第二點是可以清楚地知道哪些方法會被重載。
【譯注:從“不過”至此,這幾句話顯然不合邏輯,但原文就是如此:
“However, requiring the use of the virtual method has its pros and cons. The first pro is that is the slightly increased execution speed from avoiding virtual methods. The second pro is to make clear what methods are intended to be overridden.”。
我認為,若將被我標為斜體的method改為keyword的話,邏輯上會順暢些。這樣,第一句話就可認為是和Java比,因其方法缺省是虛的,第二句話主要是和C++比】。然而,利也可能是弊。和Java中缺省忽略final修飾符
【譯注:在Java中可利用final關鍵字,對方法上鎖,相當於C#/C++中沒有用virtual關鍵字修飾方法/成員函數的情況】以及C++中缺省忽略virtual修飾符相比,Java中缺省選項
【譯注:即虛的】使得你程序略微損失一些效率,而在C++中,它可能妨礙了擴展性,雖然這對基類的實現者來說,是不可預料的。