• 臨時多態性

    編輯
    本詞條由“匿名用戶” 建檔。

    臨時多態性

    編輯

    編程語言中,臨時多態性是一種多態性,其中多態性函數可以應用于不同類型的參數,因為一個多態性函數可以表示許多不同的和潛在的異質的實現,這取決于它所應用的參數類型。當應用于面向對象或程序性概念時,它也被稱為函數重載或運算符重載。在這種情況下,術語adhoc并不是貶義的;它只是指這種多態性不是類型系統的基本特征這一事實。這與參數化多態性相反,在參數化多態性中,多態性函數的編寫沒有提到任何特定的類型,因此可以以一種透明的方式將單一的抽象實現應用于任何數量的類型。這種分類是由ChristopherStrachey在1967年提出的。

    早期的綁定

    編輯

    特有的多態性是一種調度機制:通過一個命名的函數移動的控制被調度到其他各種函數,而不必指定被調用的確切函數。重載允許以相同的名字定義不同類型的多個函數;編譯器或解釋器自動確保正確的函數被調用。這樣一來,就可以編寫附加整數列表、字符串列表、實數列表等的函數,并全部調用append--正確的append函數將根據被附加的列表的類型被調用。這與參數化多態性不同,在參數化多態性中,函數需要通用地編寫,以適用于任何種類的列表。使用重載,可以讓一個函數根據傳遞給它的輸入類型執行兩種完全不同的事情;這在參數化多態性中是不可能的。另一種看待重載的方式是,一個例程不是由它的名字,而是由它的名字和參數的數量、順序和類型的組合來xxx識別的。這種類型的多態性在面向對象的編程語言中很常見,其中許多語言允許操作符以類似于函數的方式被重載(參見操作符重載)。一些非動態類型的語言,缺乏特別的多態性(包括類型類),其函數名稱較長,如print_int、print_string等。這可以被看作是優勢(描述性更強)或劣勢(過于冗長),取決于個人的觀點。有時從重載中獲得的一個好處是出現了專業化,例如,一個具有相同名稱的函數可以用多種不同的方式來實現,每一種方式都針對它所操作的特定數據類型進行了優化。這可以為那些由于性能原因需要專門針對多種情況的代碼提供一個方便的接口。缺點是,類型系統不能保證不同實現方式的一致性。由于重載是在編譯時完成的,所以它不能替代子類型化多態性中的后期綁定。

    晚期綁定

    編輯

    盡管有前一節的規定,臨時多態性還有其他的方式可以實現。例如,考慮一下Smalltalk語言。在Smalltalk中,重載是在運行時完成的,因為每個重載消息(重載函數)的方法(函數實現)都是在即將執行時解決的。這發生在運行時,即程序被編譯之后。因此,多態性是由子類型化多態性給出的,就像其他語言一樣,它也是在運行時通過特設的多態性來擴展功能的。仔細觀察還可以發現,Smalltalk提供的臨時多態性的種類略有不同。

    多態性

    由于Smalltalk有一個晚期綁定的執行模型,而且它為對象提供了處理不被理解的消息的能力,因此可以使用多態性來實現功能,而不用明確地重載某個特定的消息。這可能不是日常編程中普遍推薦的做法,但在實現代理時,它可能相當有用。另外,雖然在一般情況下,普通的類方法和構造函數重載不被認為是多態性,但在一些比較統一的語言中,類是常規對象。例如,在Smalltalk中,類是常規對象。反過來,這意味著發送到類的信息可以被重載,而且還可以創建行為類似于類的對象,而其類不繼承于類的層次結構。這些都是有效的技術,可以用來利用Smalltalk強大的反射功能。類似的安排在Self和Newspeak等語言中也是可行的。

    臨時多態性的例子

    編輯

    想象一下,一個運算符+可能以下列方式使用。

    內容由匿名用戶提供,本內容不代表www.gelinmeiz.com立場,內容投訴舉報請聯系www.gelinmeiz.com客服。如若轉載,請注明出處:http://www.gelinmeiz.com/170669/

    (5)
    詞條目錄
    1. 臨時多態性
    2. 早期的綁定
    3. 晚期綁定
    4. 臨時多態性的例子

    輕觸這里

    關閉目錄

    目錄
    91麻精品国产91久久久久