方法覆寫
外觀
在物件導向的編程中,方法覆寫是一種語言功能,它允許子類或子類提供已由其超類或父類之一提供的方法的特定實現。 它允許特定類型的多態性(子類型)。 子類中的實現通過提供與父類中的方法具有相同名稱、相同參數或簽名以及相同返回類型的方法來覆蓋(替換)超類中的實現。[1]執行的方法的版本將由用於調用它的對象確定。 如果使用父類的對象調用方法,則執行父類中的版本,如果使用子類的對象調用方法,則執行子類中的版本。 [2] 某些語言允許程式設計師防止方法被覆蓋。
名稱
[編輯]部分程式語言的英文術語會區分 「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# 確實支持方法覆蓋,但僅在使用修飾符override
和virtual
或abstract
明確要求時。
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().
}
注釋
[編輯]- ^ Flanagan 2002, p. 107
- ^ Lewis & Loftus 2006, p.454
- ^ C++中的Overload、Override和Overwrite – 煎炸熊の記事本. note.artchiu.org. [2023-12-30]. (原始內容存檔於2023-12-30).
- ^ Override Overload Overwrite. wuciawe.github.io. [2023-12-30]. (原始內容存檔於2023-12-30).
- ^ Lee, Wayne. Override(覆寫) & Overload(多載) &Polymorphism(多型)的差異. Medium. 2020-07-26 [2023-12-30]. (原始內容存檔於2023-12-30) (英語).
參考文獻
[編輯]- Lewis, J. & Loftus, W. (2008). Java: Software Solutions (6th ed.). Boston, MA: Pearson Addison Wesley.
- Flanagan, David.(2002).Java in a Nutshell.Retrieved from http://oreilly.com/catalog/9780596002831/preview#preview