使用多型實現Delphi動態程式設計

2021-05-06 18:03:31 字數 1231 閱讀 4082

本文使用乙個簡單例項講述如何使用多型在delphi中實現動態程式設計。

多型(polymorphism)按字面的意思就是「多種形狀」。引用charlie calverts對多型的描述——多型性是允許你將父物件設定成為和乙個或更多的他的子物件相等的技術,賦值之後,父物件就可以根據當前賦值給它的子物件的特性以不同的方式運作。更多有關多型的講述,請參考網路資料。

「動態語言「是一種在執行期間才去發現資料型別的程式語言,其有點在於其優良的擴充套件性,主要用於建立一些需要經常更新的動態系統。本文描述的動態程式設計,沒有動態語言的意思,但是能讓delphi程式同樣具有動態擴充套件的能力。

以polymorphism的字面意思來舉例,要實現乙個畫出各種形狀的程式。剛開始,可能只需要實現畫矩形、正方形的功能,但是可預知以後需要畫其它圖形。這很自然想到使用多型來實現,可是如何實現在增加其它形狀時主程式完全不用修改呢?

一、例項描述:

1. 抽象類tgeometry(幾何圖形),它有乙個畫圖形的抽象方法draw()

2. 繼承抽象類的子類:trectangle(矩形)、tsquare(正方形)等等。所有類如下圖

3. main程式無須知道子類,只通過tgeometry畫出各種圖形,也無須關心當前有多少子類

4. 例項程式介面如下

介面左側圖形單選按鈕的數量會根據tgeometry的子類數量變化。選不同單選按鈕,會呼叫相應的draw()方法在右側畫圖

這樣使用的缺點是:當增加新形狀時,主程式**需要修改。究其原因,是因為「子類例項的建立」是靜態寫在**中的。

接下來,想辦法把子類的建立從主程式中剝離,是程式具有動態特性。

三、把形狀型別從主程式中剝離

下面講述如何逐步把「子類例項的建立」靜態**從主程式中剝離。

第一步,使用case語句把形狀建立函式剝離

最簡單的方式,就是使用case語句,根據不同形狀呼叫不同子類的create方法建立子類的例項。

這樣drawgeometry()被「解脫」了,可是creategeometry()又被「套住」了:每增加乙個形狀,需要增加一行**。case語句實際上還是靜態的。

第二步,消除case語句,實現真正的「動態」

要徹底消除「靜態」,需要使用delphi提供的動態東西,最直接的就是動態陣列。如果把所有子類的形狀,以及建立例項的函式都存在動態陣列中,不就可以實現真正的「動態」了嗎。

到此為止,主程式中沒有任何與形狀子類有關的靜態**。

五、增加新的形狀子類

接下來可以體驗一下,如何新增形狀子類而不用修改主程式。

多型和動態聯編

同一 可以產生不同效果的特點,被稱為 多型 編譯器針對虛函式產生了可以在執行時刻確定被呼叫函式的 如何 動態聯編 編譯器是如何針對虛函式產生可以再執行時刻確定被呼叫函式的 呢?也就是說,虛函式實際上是如何被編譯器處理的呢?lippman在深度探索c 物件模型 1 中的不同章節講到了幾種方式,這裡把 ...

多型的實現方式以及動態聯編 靜態聯編

多型,顧名思義 多種狀態 在物件導向語言中,介面的多種不同實現方式即為多型。也就是允許將子類型別的指標賦值給父類型別的指標。class a classb public a c 中的多型實現方法為 過載 覆蓋 函式模板三種方法。其中過載是指在同一類中函式過載實現多型,覆蓋則是帶有虛函式的繼承 過載的多...

多型,覆蓋,過載,靜態聯編,動態聯編。

c 多型有兩種形式,動態多型和靜態多型。動態多型是指一般的多型,是通過類繼承和虛函式機制實現的多型 靜態多型是通過模板方法來實現,因為這種多型是在編譯時而非執行時,所以稱為靜態多型。動態多型例子 class cshape virtual cshape virtual void draw 0 clas...