面向对象技术第一讲 多态性
?面向對象技術第一講? 多態性
一﹑什么是多態?為什么要支持多態?
多態是一種普遍存在的現象,如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++語言中的虛擬函數)。
總結
以上是生活随笔為你收集整理的面向对象技术第一讲 多态性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入探讨!Batch 大小对训练的影响
- 下一篇: 计算机族应常喝的健康饮品