unit Unit3;
interface
uses SysUtils;
type
carMove = interface
function SpeedDown(): string; //減速
function ShutDown(): string; //停止
function Start(): string; //啟動
function carspeedUp(): string;
function StartBrake: string; //啟動剎車
end;
{父類:汽車類}
Tcar = class(TObject)
private
name: string;
Fwheel: Twheel;
Fbrake: Tbrake;
Fengine: Tengine;
Fcarbody: Tcarbody;
public
function CarPackage(s: string): string; virtual; //組裝汽車
end;
TAodiQ7 = class(TCar, carMove)
private
protected
// interface carMove
function SpeedDown(): string; //減速
function ShutDown(): string; //停止
function Start(): string; //啟動
function carspeedUp(): string;
function StartBrake: string; //啟動剎車
public
function CarPackage(s: string): string; override;
end;
implementation
{ TAodiQ7 }
function TAodiQ7.CarPackage(s: string): string;
begin
end;
function TAodiQ7.carspeedUp: string;
begin
end;
function TAodiQ7.ShutDown: string;
begin
end;
function TAodiQ7.SpeedDown: string;
begin
end;
function TAodiQ7.Start: string;
begin
end;
function TAodiQ7.StartBrake: string;
begin
end;
{ Tcar }
function Tcar.CarPackage(s: string): string;
begin
end;
end.
介面carMove 宣告的 SpeedDown() ShutDown() Start() carspeedUp() StartBrake這幾個函式和方法在子類TAodiQ7又重新申明了,我不明白的是既然又重新申明為什么還要在介面申明不是多此一舉嗎,沒分了請大家不要見怪
uj5u.com熱心網友回復:
介面只是規定行為,只是規定 只是規定,由呼叫這個介面的類去實作 。 百度一下 介面 和 類的定義 。。。uj5u.com熱心網友回復:
那我不要也一樣可以實作,為什么要這么多此一舉呢uj5u.com熱心網友回復:
TAodiQ7是介面的實作類,這不是類的繼承,不要用類的思維方法,介面可以多重繼承,但delohi類不可以多重繼承,為什么用介面,這不是三言兩語能說明的,可以簡單的理解介面的抽象級別更高,至于什么時候用介面沒什么時候用類,只能慢慢體會,只可意會不可言傳uj5u.com熱心網友回復:
不要是可以實作, 可能呼叫這個車介面的實作類有很多 ,有奧迪 、寶馬、奔馳 ,但是他們都有啟動 停止 剎車行為 ,把這些行為抽象成介面 ,再新增車型類的時候 ,就可以直接繼承這個介面 ,規范化新增車型的行為(都叫啟動 停止 剎車 而不是叫奧迪叫啟動123 寶馬叫 啟動345)。
uj5u.com熱心網友回復:
就像 單詞是一個一個字母組成的,奧迪類是繼承的 介面和基礎類 ,把具有共有行為的定義成介面、把具有共有屬性、方法的定義成類,然后他們結合生成具體的類(奧迪、寶馬、奔馳類 ) 。這些概念比較抽象 ,講不好
uj5u.com熱心網友回復:
其實就Delphi的VCL架構采用繼承/委托這樣的結構基本是完全能涵蓋“介面”這樣的概念了,不過,“介面”本質上是Windows體系里的,也就是微軟的利器,既然你要開發For Windows的應用程式嘛,那當然要妥協的啦。uj5u.com熱心網友回復:
與windows沒有多少關系,雖然最初介面出現的時候是為了簡化基于COM的程式設計(在D5中,最基本的介面是IUnknown,顯然是COM相關的),不過從D6開始,基本介面已經變成了IInterface,是基礎語言特性。uj5u.com熱心網友回復:
其實我覺得a295281315已經講的很清楚了。父類里宣告的這些函式或者屬性,只是表示它有這些。子類里再宣告一次是具體的描述。可以這么理解,汽車都有方向盤,所以在汽車類里我要宣告一個方向盤。而對于奧迪而言,它也有方向盤,所以在奧迪里我還要宣告一個方向盤。因為奧迪的方向盤和汽車的方向盤是一樣的東西,所以奧迪就從汽車的類中繼承一下方向盤,本田車也可以繼承這個方向盤,并且各自都可以給自己的方向盤加一些個性化的功能或者屬性。奧迪方向盤的個性化的部分,在汽車這個類的方向盤里是沒有的。
如果汽車類不宣告方向盤,也就是說汽車這一類是沒有方向盤的。那么奧迪車就要自己定義方向盤,本田車也要定義自己的方向盤。每種車都要定義自己的方向盤。雖然對于每種車而言,沒什么影響,但是對于汽車這一類來說,就沒有方向盤了。未來,假如我們需要描述“通過方向盤可以控制汽車行進的方向”,就無法做到了。
uj5u.com熱心網友回復:
其實介面只是對某個物件開個口子,這個口子里包含你可以給呼叫方(客戶端)訪問的一些方法或者屬性uj5u.com熱心網友回復:
與windows沒有多少關系,雖然最初介面出現的時候是為了簡化基于COM的程式設計(在D5中,最基本的介面是IUnknown,顯然是COM相關的),不過從D6開始,基本介面已經變成了IInterface,是基礎語言特性。
COM 本身就是當初 Microsoft 為 Visual Basic 3.0 制訂的控制元件規范,如果從效率上看,COM 被VCL秒得渣都不剩了,不過,Microsoft 畢竟控制了基礎平臺,所以就又搞個 DCOM 出來忽悠唄
uj5u.com熱心網友回復:
個人理解,介面定義只是類功能擴展的一個說明,在被繼承的類中,沒有具體的實作方法,所以,沒有override關鍵字,但繼承該介面的類必須提供實作該介面的方法(即使僅僅只有一對begin end),所以,后面必須再宣告一次;一個類被繼承時,可以有多種介面,生成不同新類,當然也可以沒有介面,這樣只是給類改了個名字而已,或者通過覆寫父類的方法,在原有類的功能基礎上加強功能而生成新類,象Form1 = Class(TForm)就是一個不帶介面類的繼承;另一個理解是,介面也是一個類,只是一個抽象類,沒有現成的實作方法(不象真正的類,本來就帶有實作方法),只是給了個名字給你,要怎么實作看你的本事,繼承只是將兩個類打包成一個擁有更多功能的類,被繼承的介面和被繼承的類應該沒啥大的關系,反而跟繼承它的類有很大的關系。uj5u.com熱心網友回復:
介面是給客戶端呼叫時 讓其遵守你的規范,具體服務端可以根據具體情況 來做不同的實作 ,這樣便于以同一種規范來呼叫,也就是所謂的去除藕合uj5u.com熱心網友回復:
介面的用途非常廣而且很重要,它主要是保證繼承自不同基類的派生類能夠增加一些共同特性,一個人可以不可以8條腿,在人的基類里定義是不能的,因為只有兩條。。如果某件事情要求很簡單,你要有8條腿就可去做,并不關心你繼承自哪個基類,那么由于繼承自不同基類的派生類沒有共性,想讓他們有,另一個辦法就是繼承一個介面,人裝6個假肢就行了,但螃蟹也要繼承這個介面,但不用裝假肢,這個介面就是他們的共性。。。在程式中代碼對于函式呼叫不是根據函式名的而是地址偏移,這要切記,介面可以鎖定地址偏移(這是為什么在Dilphi里介面要有GUID的原因),繼承自不同型別的派生類,就算有兩個從名稱到引數完全相同的函式,他也不是他們之間的共性,只能說是代碼上撞衫了,原始碼是原始碼,但機器碼只人地址,不能有效定位地址那就沒法運行,具有相同特性就是在統一個偏移量上有相同功能的函式或變數,名字不是機器碼中所具有的特性。。。。uj5u.com熱心網友回復:
無論是介面還是類,他的目的是起到對成員進行地址定位的作用,你要有這個理解,代碼之人地址,假設一個超多網格的柜子(物件記憶體),其中第四個是蘋果,第5個是鴨梨,這是基類定義好的,所以所有派生類都會是這樣,第四個是蘋果,第五個是鴨梨。。另一個基類是第四個是槍子,第5個是炸彈,第六個才是蘋果。。。一個人從箱子里找蘋果吃,但沒有名字只有編號(對于CPU是這樣的),必須要知道他的派生自哪個型別,否則直接想當然的選4號你可能要吃到是槍子。。。所以上以上兩個類雖然都有蘋果,但沒有共同特征,CPU做不到對蘋果的定位,抽象類基類存在的意義就是相同特性想相同定位,派生自不同類就是兩個世界。。。還有就是介面的問題,由于一個類只能繼承一個基類,也就是上面的兩種箱子注定不可能有共性定義了,當然沒這么悲劇,還有介面在,假設一個介面的定義是,看到紅色箱子(介面的GUID)向后數5個各自就是橘子,那么以上兩個不同的類只要繼承這個定位方法,就可以讓CPU順利找到橘子了,和他的派生自哪個類沒半毛錢關系,介面雖然沒有實作任何內容,但它明確給出了函式定位方式,在GUID后偏移4個位元組就是第一個介面成員函式的函式指標,以此類推,那么繼承者也會按這個規則編譯介面函式指標地址,那么共性就有了。。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/44316.html
標籤:VCL組件開發及應用
上一篇:delphi webbrowser frame內嵌iframe,怎么讀取
下一篇:如何計算年齡的xx歲xx月xx日
