方法覆寫

面向對象的編程中,方法覆寫是一種語言功能,它允許子類或子類提供已由其超類或父類之一提供的方法的特定實現。 它允許特定類型的多態性(子類型)。 子類中的實現通過提供與父類中的方法具有相同名稱、相同參數或簽名以及相同返回類型的方法來覆蓋(替換)超類中的實現。[1]執行的方法的版本將由用於調用它的對象確定。 如果使用父類的對象調用方法,則執行父類中的版本,如果使用子類的對象調用方法,則執行子類中的版本。 [2] 某些語言允許程序員防止方法被覆蓋。

Illustration

名稱

部分編程語言的英文術語會區分 「overwrite」 和 「override」 兩個詞。在 C++ 的術語中,override 指的是以具有相同名稱及參數列的函數覆蓋其父類中的虛擬函數,overwrite 則是指以名稱相同但參數列不同的函數覆蓋其父類中的虛擬函數或以名稱相同且參數列相同的函數覆蓋其父類中的非虛擬函數。[3][4]然而這兩個詞都經常被翻譯為中文的「覆寫[5],故而導致混淆。

特定語言示例

Ada

Ada 默認提供方法覆蓋。為了有利於早期錯誤檢測(例如拼寫錯誤),可以指定何時期望方法實際覆蓋或不覆蓋。這將由編譯器檢查。

  type T is new Controlled with ......;
  procedure Op(Obj: in out T; Data: in Integer);

  type NT is new T with null record;
  overriding    -- overriding indicator
  procedure Op(Obj: in out NT; Data: in Integer);
  overriding    -- overriding indicator
  procedure Op(Obj: in out NT; Data: in String);
  -- ^ compiler issues an error: subprogram "Op" is not overriding

C#

C# 確實支持方法覆蓋,但僅在使用修飾符overridevirtualabstract明確要求時。

abstract class Animal
{
    public          string Name { get; set; }
    // Methods
    public          void   Drink();
    public virtual  void   Eat();
    public          void   Go();
}

class Cat : Animal
{
    public new      string Name { get; set; }
    // Methods
    public          void   Drink();  // Warning: hides inherited drink(). Use new
    public override void   Eat();    // Overrides inherited eat().
    public new      void   Go();     // Hides inherited go().
}

注釋

  1. ^ Flanagan 2002, p. 107
  2. ^ Lewis & Loftus 2006, p.454
  3. ^ C++中的Overload、Override和Overwrite – 煎炸熊の記事本. note.artchiu.org. [2023-12-30]. (原始內容存檔於2023-12-30). 
  4. ^ Override Overload Overwrite. wuciawe.github.io. [2023-12-30]. (原始內容存檔於2023-12-30). 
  5. ^ Lee, Wayne. Override(覆寫) & Overload(多載) &Polymorphism(多型)的差異. Medium. 2020-07-26 [2023-12-30]. (原始內容存檔於2023-12-30) (英語). 

參考文獻

頁面存檔備份,存於網際網路檔案館