多型 (Polymorphism) 常被視為物件導向程式設計在封裝 (Encapsulation) 和繼承 (Inheritance) 以外的第三個支柱。 「多型」是一個希臘字,表示「多種形體」,並有兩個特殊的面向:
在執行階段,在如方法參數和集合或陣列等地方,衍生類別的物件會被視為基底類別的物件。 當這樣的情況發生時,物件的宣告型別和其在執行階段的型別將不再相同。
基底類別可以定義與實作虛擬「方法」(Method),而衍生類別可以覆寫它們,表示衍生類別會提供本身的定義與實作。 在執行階段,當用戶端程式碼呼叫方法時,CLR 會查詢物件的執行階段型別,並叫用虛擬方法的覆寫。 因此在您的原始程式碼中,您可以呼叫基底類別上的方法,並讓衍生類別版本的方法執行。
虛擬方法能讓您以統一的方法使用相關物件的群組。 例如,假設您有一個繪圖應用程式,可以讓使用者在繪圖介面上建立各種類型的圖案。 在編譯時期,您並不知道使用者究竟會建立哪一種圖案。 然而,應用程式必須追蹤建立的所有圖案類型,並根據使用者的滑鼠動作更新圖案。 您可以使用多型,以兩個基本的步驟解決這個問題:
建立類別階層,其中每個特定的圖案類別都衍生自一般的基底類別。
透過對基底類別方法的單一呼叫,使用虛擬方法叫用任何衍生類別上的適當方法。
首先,建立稱為 Shape 的基底類別,以及像 Rectangle、Circle 和 Triangle 等衍生類別。 給予 Shape 類別稱為 Draw 的虛擬方法,並在每個衍生類別中覆寫此方法,以繪製該類別所代表的特定圖案。 建立 List<Shape> 物件,並在其中加入 Circle、Triangle 和 Rectangle。 使用 foreach 迴圈逐一查看清單,並呼叫清單中每個 Shape 物件上的 Draw 方法,以更新繪圖介面。 雖然清單中的每個物件都有 Shape 的宣告型別,但會受到叫用的是執行階段型別 (每個衍生類別中受覆寫版本的方法)。
沒有留言:
張貼留言