多態 (polymorphism) 一詞最初來源於希臘語 polumorphos,含義是具有多種形式或形態的情形。在程序設計領域,一個廣泛認可的定義是“一種將不同的特殊行為和單個泛化記號相關聯的能力”。然而在人們的直觀感覺中,多態的含義大約等同於“同一個方法對於不同類型的輸入參數均能做出正確的處理過程,並給出人們所期望獲得的結果”,也許這正體現了人們對於多態性所能達到的效果所寄予的期望:使程序能夠做到越來越智能化,越來越易於使用,越來越能夠使設計者透過形形色色的表象看到代碼所要觸及到的問題本質。
總體是分為通用多態和專用多態:
通用多態:不同的類型值,執行相同的代碼。
專用多態:不同的類型值,執行不同的代碼。(類似枚舉 “什麼類型,執行什麼操作”)
通用多態分為:參數多態和包含多態
參數多態:參考c++中的template(靜態聯編時候實現)
包含多態:可以理解為abstract functions,interface的方法(動態聯編時候實現,)
專用多態:強制多態和重載多態
強制多態:可以理解為類型的隱式轉換(靜態聯編時候實現)
重載多態:參考C++中的函數重載的理解(靜態聯編時候實現)
概念:采用參數化模板,通過給出不同的類型實參,使得一個結構有多種類型。
概念:同樣的操作可用於一個類型及其子類型。
例:Pascal 中的子界。子類型:a value of a subtype can be used everywhere a value of the supertype can be expected.
注意:子類型與將來要介紹的子類是有區別的。包含多態一般需要進行運行時的類型檢查。
概念:同一個名(操作符、函數名)在不同的上下文中有不同的類型。
程序設計語言中基本類型的大多數操作符都是過載多態的。
概念:編譯程序通過語義操作,把操作對象的類型強行加以變換,以符合函數或操作符的要求。
老師要求我們用C語言的一條語句實現四種多態,想了半天,只能這樣寫了,下面是代碼,可能理解上有出入,包含多態的語句不太確定的是。
#include <stdio.h> enum dataType { INT, DOUBLE, CHAR, }; int f(void *a,int dataType){//這裡實現了參數多態的函數! switch (dataType){ case 1: { int x=*(int*)a; break; } case 2: { char x=*(char*)a; break; } case 3: { double x=*(double*)a; break; } } return 0; } void main (){ int i=1; double j=2.0; float a=3.0,b=4.0;//double的子類型 double c=5.0,d=6.0; printf("參數多態%d,%d\n包含多態%lf,%lf\n過載多態%f,%lf\n強制多態%lf\n",sizeof(int),c*d,a*b,(1+2),(1.0+2.0),1); //本條語句分別實現了參數、包含、過載、強制多態 }
這裡要講的是參數多態,雖然覺得實現起來用處不大,但是至少C可以實現。主要用到的是void,幾乎所有講授 C 語言課程的老師都會告訴你:“指針是整個 C 語言的精髓所在。”而你也一直敬畏著指針,又愛又恨地使用著它。許多教材都告訴你,int * 叫做指向整型的指針,而 char * 是指向字符型的指針,等等不一而足。然而這裡有一個另類的指針家族成員—— void *。不要按照通常的命名方式叫它做指向 void 類型的指針,它的正式的名字叫做:可以指向任意類型的指針。你一定注意到了“任意類型”這四個字,沒錯,實現多態,我們靠的就是它。