面向对象技术第一讲 多态性
?面向?qū)ο蠹夹g(shù)第一講? 多態(tài)性
一﹑什么是多態(tài)?為什么要支持多態(tài)?
多態(tài)是一種普遍存在的現(xiàn)象,如water的三種形態(tài):冰﹑水﹑汽,又如算術(shù)運(yùn)算1+1, 1+0.5, 1/2+0.5等。
多態(tài)性用一句經(jīng)典的英文來(lái)解釋就是:a value can belong to multiple types.
那么在軟件設(shè)計(jì)中支持多態(tài)有什么好處呢?首先,可以使程序中的數(shù)學(xué)運(yùn)算符合常規(guī)的數(shù)學(xué)運(yùn)算規(guī)則,為程序提供更強(qiáng)的表達(dá)能力;其次使得對(duì)不同類型的數(shù)據(jù)有同樣的操作語(yǔ)義,可以實(shí)現(xiàn)程序的重用,而重用標(biāo)識(shí)的資源,可以提高程序的可讀性和可理解性。
軟件系統(tǒng)支持多態(tài)的前提就是能夠靜態(tài)(編譯時(shí))或者動(dòng)態(tài)(運(yùn)行時(shí))地確定類型。
二﹑多態(tài)的分類有哪些?
多態(tài)分為兩種:通用的多態(tài)(universal)和特定的多態(tài)(ad hoc)。兩者的區(qū)別是前者對(duì)工作的類型不加限制,允許對(duì)不同類型的值執(zhí)行相同的代碼;后者只對(duì)有限數(shù)量的類型有效,而且對(duì)不同類型的值可能要執(zhí)行不同的代碼。
通用的多態(tài)又分為參數(shù)多態(tài)(parametric)和包含多態(tài)(inclusion);特定的多態(tài)分為過(guò)載多
態(tài)(overloading)和強(qiáng)制多態(tài)(coercion)。具體見(jiàn)下圖:
2.1參數(shù)多態(tài)
??? 概念:采用參數(shù)化模板,通過(guò)給出不同的類型參數(shù),使得一個(gè)結(jié)構(gòu)有多種類型。
??? 例如:Ada中的generic(類屬 )。
??? 見(jiàn)下例:
分析:這兩個(gè)packages的:
·應(yīng)用內(nèi)涵一致:提供的都是堆棧抽象操作。
·實(shí)現(xiàn)結(jié)構(gòu)相似:采用同類數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)代碼相同。
·元素的類型不同,一些用常量表示的細(xì)節(jié)不同。
對(duì)比:函數(shù)是相似的語(yǔ)句序列的一種涵義明確的抽象,用函數(shù)中的語(yǔ)句表示相同的部分,用形參指明不同的部分,用實(shí)參體現(xiàn)不同的部分。但是,函數(shù)的參數(shù)只能是數(shù)據(jù),不能是類型。
??? 類屬在一個(gè)抽象結(jié)構(gòu)中允許以參量形式來(lái)表示可變的類型﹑函數(shù)﹑常數(shù)﹑數(shù)據(jù)值,在編譯時(shí)
(靜態(tài))進(jìn)行實(shí)例化,結(jié)果是一個(gè)具體的結(jié)構(gòu)(類型﹑函數(shù)等)。而且類型的實(shí)例化可以靜態(tài)進(jìn)
行,也可以動(dòng)態(tài)進(jìn)行,但結(jié)果都是一個(gè)值。
Ada中的generic結(jié)構(gòu)體現(xiàn)的多態(tài)性例子如下:
generic結(jié)構(gòu)調(diào)用的時(shí)候的情況:
可見(jiàn):
·對(duì)實(shí)參所取得類型不加限制。
·對(duì)不同的實(shí)參執(zhí)行的是相同的代碼。
因而構(gòu)成了多態(tài)。
2.2 包含多態(tài)
概念:同樣的操作可用于一個(gè)類型及其子類型。(注意是子類型,不是子類。)包含多態(tài)
一般需要進(jìn)行運(yùn)行時(shí)的類型檢查。如Pascal中的子界。
幾點(diǎn)需要注意的地方:
1. 包含多態(tài)的操作存在著逆單調(diào)(Anti-mornotonic)。即一個(gè)類型t上的操作,當(dāng)其定義域縮小成t的一個(gè)子類型時(shí),其值域應(yīng)不小于t.
2.3 過(guò)載多態(tài)
概念:同一個(gè)名(操作符﹑函數(shù)名)在不同的上下文中有不同的類型。程序設(shè)計(jì)語(yǔ)言中基本類型的大多數(shù)操作符都是過(guò)載多態(tài)的。如c語(yǔ)言中的
==? :? int * int -> int
==? :? double*double->int
==? :? char*char->int
有一些程序設(shè)計(jì)語(yǔ)言允許用戶自定義過(guò)載多態(tài)的操作符。如c++語(yǔ)言中的:
bool? operator == (Complex1 c1,? Complex c2);
bool? operator ==(Address a1,? Address a2);
過(guò)載多態(tài)的操作符或函數(shù)名,他所對(duì)應(yīng)的通常是不同的實(shí)現(xiàn)。
2.4 強(qiáng)制多態(tài)
概念:編譯程序通過(guò)語(yǔ)義操作,把操作對(duì)象的類型強(qiáng)行加以變換,以符合函數(shù)或操作符的要求。程序設(shè)計(jì)語(yǔ)言中基本類型的大多數(shù)操作符,在發(fā)生不同類型的數(shù)據(jù)進(jìn)行混合運(yùn)算時(shí),
編譯程序一般都會(huì)進(jìn)行強(qiáng)制多態(tài)。程序員也可以顯示地進(jìn)行強(qiáng)制多態(tài)的操作(Casting)。
例如:
要注意的是并不是任意兩個(gè)類型之間都可以進(jìn)行強(qiáng)制多態(tài)。在不同類型之間實(shí)現(xiàn)強(qiáng)制多態(tài),通常需要執(zhí)行不同的轉(zhuǎn)換操作。強(qiáng)制多態(tài)的原則是:將值集較小(即占用存儲(chǔ)空間較小)的類型,變換成值集包含了前者(即占用存儲(chǔ)空間較大)的類型,反之,應(yīng)當(dāng)注意可能發(fā)生的對(duì)值的損傷(特別是在使用Casting時(shí))。
有時(shí),強(qiáng)制多態(tài)與過(guò)載多態(tài)是混合出現(xiàn)的。例如,對(duì)于表達(dá)式1+2; 1.0+2; 1+2.0; 1.0+2.0;
中出現(xiàn)的多態(tài),就會(huì)有多種解釋:
·操作符+有四種過(guò)載多態(tài);
·操作符+只有一種:double * double -> double, 要將參與運(yùn)算的整數(shù)強(qiáng)制變換成浮點(diǎn)數(shù);
·操作符+有兩種過(guò)載多態(tài):int * int -> int 和 double * double -> double,要將混合運(yùn)算中的整數(shù)強(qiáng)制變換成浮點(diǎn)數(shù)。
?
三﹑ 其他類型的多態(tài)
現(xiàn)在的多數(shù)文獻(xiàn)中都認(rèn)為,在面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言中還存在著兩種多態(tài):
·在有繼承關(guān)系的類之間存在的多態(tài)(但不能完全等同于包含多態(tài));
·通過(guò)動(dòng)態(tài)綁定機(jī)制,在運(yùn)行時(shí)才確定接受消息的對(duì)象類型(如c++語(yǔ)言中的虛擬函數(shù))。
總結(jié)
以上是生活随笔為你收集整理的面向对象技术第一讲 多态性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: 深入探讨!Batch 大小对训练的影响
- 下一篇: python是什么?python该怎么学
