物件導向技術第一講 多型性 原創

2021-08-21 22:59:34 字數 2709 閱讀 8590

物件導向技術第一講 多型性

什麼是多型?為什麼要支援多型?

多型是一種普遍存在的現象,如water的三種形態:冰﹑水﹑汽,又如算術運算1+1, 1+0.5, 1/2+0.5等。

多型性用一句經典的英文來解釋就是:a value can belong to multiple types.

那麼在軟體設計中支援多型有什麼好處呢?首先,可以使程式中的數**算符合常規的數**算規則,為程式提供更強的表達能力;其次使得對不同型別的資料有同樣的操作語義,可以實現程式的重用,而重用標識的資源,可以提高程式的可讀性和可理解性。

軟體系統支援多型的前提就是能夠靜態(編譯時)或者動態(執行時)地確定型別。

多型的分類有哪些?

多型分為兩種:通用的多型(universal)和特定的多型(ad hoc)。兩者的區別是前者對工作的型別不加限制,允許對不同型別的值執行相同的**;後者只對有限數量的型別有效,而且對不同型別的值可能要執行不同的**。

通用的多型又分為引數多型(parametric)和包含多型(inclusion);特定的多型分為過載多

態(overloading)和強制多型(coercion)。具體見下圖:

2.1引數多型

概念:採用引數化模板,通過給出不同的型別引數,使得乙個結構有多種型別。

例如:ada中的generic(類屬 )。

見下例:

分析:這兩個packages的:

·應用內涵一致:提供的都是堆疊抽象操作。

·實現結構相似:採用同類資料結構,實現**相同。

·元素的型別不同,一些用常量表示的細節不同。

對比:函式是相似的語句序列的一種涵義明確的抽象,用函式中的語句表示相同的部分,用形參指明不同的部分,用實參體現不同的部分。但是,函式的引數只能是資料,不能是型別。

類屬在乙個抽象結構中允許以參量形式來表示可變的型別﹑函式﹑常數﹑資料值,在編譯時

(靜態)進行例項化,結果是乙個具體的結構(型別﹑函式等)。而且型別的例項化可以靜態進

行,也可以動態進行,但結果都是乙個值。

ada中的generic結構體現的多型性例子如下:

generic結構呼叫的時候的情況:

可見:·對實參所取得型別不加限制。

·對不同的實參執行的是相同的**。

因而構成了多型。

2.2 包含多型

概念:同樣的操作可用於乙個型別及其子型別。(注意是子型別,不是子類。)包含多型

一般需要進行執行時的型別檢查。如pascal中的子界。

幾點需要注意的地方: 1.

包含多型的操作存在著逆單調(anti-mornotonic)。即乙個型別t上的操作,當其定義域縮小成t的乙個子型別時,其值域應不小於t.

2.3 過載多型

概念:同乙個名(操作符﹑函式名)在不同的上下文中有不同的型別。程式語言中基本型別的大多數操作符都是過載多型的。如c語言中的

== : int * int -> int

== : double*double->int

== : char*char->int

有一些程式語言允許使用者自定義過載多型的操作符。如c++語言中的:

bool operator == (complex1 c1, complex c2);

bool operator ==(address a1, address a2);

過載多型的操作符或函式名,他所對應的通常是不同的實現。

2.4 強制多型

概念:編譯程式通過語義操作,把操作物件的型別強行加以變換,以符合函式或操作符的要求。程式語言中基本型別的大多數操作符,在發生不同型別的資料進行混合運算時,

編譯程式一般都會進行強制多型。程式設計師也可以顯示地進行強制多型的操作(casting)。

例如:

要注意的是並不是任意兩個型別之間都可以進行強制多型。在不同型別之間實現強制多型,通常需要執行不同的轉換操作。強制多型的原則是:將值集較小(即占用儲存空間較小)的型別,變換成值集包含了前者(即占用儲存空間較大)的型別,反之,應當注意可能發生的對值的損傷(特別是在使用casting時)。

有時,強制多型與過載多型是混合出現的。例如,對於表示式1+2; 1.0+2; 1+2.0; 1.0+2.0;

中出現的多型,就會有多種解釋:

·操作符+有四種過載多型;

·操作符+只有一種:double * double -> double, 要將參與運算的整數強制變換成浮點數;

·操作符+有兩種過載多型:int * int -> int 和 double * double -> double,要將混合運算中的整數強制變換成浮點數。

其他型別的多型

現在的多數文獻中都認為,在物件導向程式設計語言中還存在著兩種多型:

·在有繼承關係的類之間存在的多型(但不能完全等同於包含多型);

·通過動態繫結機制,在執行時才確定接受訊息的物件型別(如c++語言中的虛函式)。

全文完

張秀君 整理

2004. 9 .17

物件導向的多型 多型性

多型指的是一類事物有多種形態,比如水有多種形態 冰 水 水蒸氣,但都是h2o,下面定義乙個h2o的父類和三種形態的子類 class h2o def init self,name,temperature self.name name self.temperature temperature deftu...

物件導向之多型 多型性

一 多型 多型指的是一類事物有多種形態 動物有多種形態 人,狗,豬 import abcclass animal metaclass abc.abcmeta 同一類事物 動物 abc.abstractmethod deftalk self pass class people animal 動物的形態...

物件導向程式設計 多型性

include iostream using namespace std class b0 int main 輸出 b1 display d1 display 示例3 include using namespace std class b0 基類b0宣告 void main 主函式 輸出 b0 di...