深入剖析C 的多型

2021-03-31 08:56:31 字數 2909 閱讀 4391

天雨

一、什麼是多型

物件導向程式設計中的另外乙個重要概念是多型性。在執行時,可以通過指向基類的指標,來呼叫實現派生類中的方法。可以把一組物件放到乙個陣列中,然後呼叫它們的方法,在這種場合下,多型性作用就體現出來了,這些物件不必是相同型別的物件。當然,如果它們都繼承自某個類,你可以把這些派生類,都放到乙個陣列中。如果這些物件都有同名方法,就可以呼叫每個物件的同名方法。

同一操作作用於不同的物件,可以有不同的解釋,產生不同的執行結果,這就是多型性。多型性通過派生類過載基類中的虛函式型方法來實現。

在物件導向的系統中,多型性是乙個非常重要的概念,它允許客戶對乙個物件進行操作,由物件來完成一系列的動作,具體實現哪個動作、如何實現由系統負責解釋。

「多型性」一詞最早用於生物學,指同一種族的生物體具有相同的特性。在c#中,多型性的定義是:同一操作作用於不同的類的例項,不同的類將進行不同的解釋,最後產生不同的執行結果。c#支援兩種型別的多型性:

● 編譯時的多型性

編譯時的多型性是通過過載來實現的。對於非虛的成員來說,系統在編譯時,根據傳遞的引數、返回的型別等資訊決定實現何種操作。

● 執行時的多型性

執行時的多型性就是指直到系統執行時,才根據實際情況決定實現何種操作。c#中,執行時的多型性通過虛成員實現。

編譯時的多型性為我們提供了執行速度快的特點,而執行時的多型性則帶來了高度靈活和抽象的特點。

二、實現多型

多型性是類為方法(這些方法以相同的名稱呼叫)提供不同實現方式的能力。多型性允許對類的某個方法進行呼叫而無需考慮該方法所提供的特定實現。例如,可能有名為 road 的類,它呼叫另乙個類的 drive 方法。這另乙個類 car 可能是 sportscar 或 **allcar,但二者都提供 drive 方法。雖然 drive 方法的實現因類的不同而異,但 road 類仍可以呼叫它,並且它提供的結果可由 road 類使用和解釋。

可以用不同的方式實現元件中的多型性:

● 介面多型性。

● 繼承多型性。

● 通過抽象類實現的多型性。

介面多型性

多個類可實現相同的「介面」,而單個類可以實現乙個或多個介面。介面本質上是類需要如何響應的定義。介面描述類需要實現的方法、屬性和事件,以及每個成員需要接收和返回的引數型別,但將這些成員的特定實現留給實現類去完成。

元件程式設計中的一項強大技術是能夠在乙個物件上實現多個介面。每個介面由一小部分緊密聯絡的方法、屬性和事件組成。通過實現介面,元件可以為要求該介面的任何其他元件提供功能,而無需考慮其中所包含的特定功能。這使後續元件的版本得以包含不同的功能而不會干擾核心功能。其他開發人員最常使用的元件功能自然是元件類本身的成員。然而,包含大量成員的元件使用起來可能比較困難。可以考慮將元件的某些功能分解出來,作為私下實現的單獨介面。

根據介面來定義功能的另乙個好處是,可以通過定義和實現附加介面增量地將功能新增到元件中。優點包括:

1.簡化了設計過程,因為元件開始時可以很小,具有最小功能;之後,元件繼續提供最小功能,同時不斷插入其他的功能,並通過實際使用那些功能來確定合適的功能。

2.簡化了相容性的維護,因為元件的新版本可以在新增新介面的同時繼續提供現有介面。客戶端應用程式的後續版本可以利用這些介面的優點。

通過繼承實現的多型性

多個類可以從單個基類「繼承」。通過繼承,類在基類所在的同一實現中接收基類的所有方法、屬性和事件。這樣,便可根據需要來實現附加成員,而且可以重寫基成員以提供不同的實現。請注意,繼承類也可以實現介面,這兩種技術不是互斥的。

c# 通過繼承提供多型性。對於小規模開發任務而言,這是乙個功能強大的機制,但對於大規模系統,通常證明會存在問題。過分強調繼承驅動的多型性一般會導致資源大規模地從編碼轉移到設計,這對於縮短總的開發時間沒有任何幫助。

何時使用繼承驅動的多型性呢?使用繼承首先是為了向現有基類新增功能。若從經過完全除錯的基類框架開始,則程式設計師的工作效率將大大提高,方法可以增量地新增到基類而不中斷版本。當應用程式設計包含多個相關類,而對於某些通用函式,這些相關類必須共享同樣的實現時,您也可能希望使用繼承。重疊功能可以在基類中實現,應用程式中使用的類可以從該基類中派生。抽象類合併繼承和實現的功能,這在需要二者之一的元素時可能很有用。

通過抽象類實現的多型性

抽象類同時提供繼承和介面的元素。抽象類本身不能例項化,它必須被繼承。該類的部分或全部成員可能未實現,該實現由繼承類提供。已實現的成員仍可被重寫,並且繼承類仍可以實現附加介面或其他功能。

抽象類提供繼承和介面實現的功能。抽象類不能示例化,必須在繼承類中實現。它可以包含已實現的方法和屬性,但也可以包含未實現的過程,這些未實現過程必須在繼承類中實現。這使您得以在類的某些方法中提供不變級功能,同時為其他過程保持靈活性選項開啟。抽象類的另乙個好處是:當要求元件的新版本時,可根據需要將附加方法新增到基類,但介面必須保持不變。

何時使用抽象類呢?當需要一組相關元件來包含一組具有相同功能的方法,但同時要求在其他方法實現中具有靈活性時,可以使用抽象類。當預料可能出現版本問題時,抽象類也具有價值,因為基模擬較靈活並易於被修改。

深入剖析C 的多型

一 什麼是多型 物件導向程式設計中的另外乙個重要概念是多型性。在執行時,可以通過指向基類的指標,來呼叫實現 派生類中的方法。可以把一組物件放到乙個陣列中,然後呼叫它們的方法,在這種場合下,多型性作用就體現出來了,這些物件不必是相同型別的物件。當然,如果 它們都繼承自某個類,你可以把這些派生類,都放到...

深入剖析C 的多型

天雨 一 什麼是多型 物件導向程式設計中的另外乙個重要概念是多型性。在執行時,可以通過指向基類的指標,來呼叫實現派生類中的方法。可以把一組物件放到乙個陣列中,然後呼叫它們的方法,在這種場合下,多型性作用就體現出來了,這些物件不必是相同型別的物件。當然,如果它們都繼承自某個類,你可以把這些派生類,都放...

深入剖析C 的多型

一 什麼是多型 物件導向程式設計中的另外乙個重要概念是多型性。在執行時,可以通過指向基類的指標,來呼叫實現派生類中的方法。可以把一組物件放到乙個陣列中,然後呼叫它們的方法,在這種場合下,多型性作用就體現出來了,這些物件不必是相同型別的物件。當然,如果它們都繼承自某個類,你可以把這些派生類,都放到乙個...