多重繼承<?XML:NAMESPACE PREFIX = O />
<?XML:NAMESPACE PREFIX = V />
從上圖來看,你可以發現子直接繼承人類別,而不是繼承父或母,那子類別如何擁有父與母的特性呢? 例如子類別要擁有抽煙的能力?
TMyObject=class(TEdit,IMyInterface,IUnknown)
這樣你就可以使用as 來轉型,可是如果你要使用Supports 的話,Compiler 會丟出一個錯誤,因此還是使用GetInterface 來的方便一點!
轉型規則
圖:多重繼承
<?XML:NAMESPACE PREFIX = V />
多重繼承的替代品 - Interface
Interface
以支援某種能力(或擁有某種能力) 為主體來取代多重繼承,以上面的類別來定義的話,就如下圖:
圖:以Interface 實作取代繼承
從上圖來看,你可以發現子直接繼承人類別,而不是繼承父或母,那子類別如何擁有父與母的特性呢? 例如子類別要擁有抽煙的能力?
圖:Interface 繼承
我知道這不太雅,呵,你就將就一下吧 :)
因此我們重新定義一下父母子的關係
圖:實作繼承的Interface
Interface 繼承與Class 繼承是差不多的,只是Interface 繼承了定義而非實體
類別也可以實作多個Interface,例如下圖:
DELPHI(PASCAL) 與Interface
OK,我想這個範例大家都看過了,接下來我們變點不一樣的
嘿! 我可沒要你照著打哦,這樣是不會通過編譯的,你得變成這樣才行(在DELPHI 5).
TMyObject=class(TEdit,IMyInterface,IUnknown)
這樣你就可以使用as 來轉型,可是如果你要使用Supports 的話,Compiler 會丟出一個錯誤,因此還是使用GetInterface 來的方便一點!
實作多個Interface
轉型規則
Symmetric(對稱) 當你透過A 成功取得 B,那麼你也可以透過B 成功取得
A
Transitive(遞移) 當你透過A 成功取得B,且透過B 成功取得C,那麼你也可以透過A 成功取得 C.
Reflexive(反身) 使用A 查詢 A 必定是成功的.
Transitive(遞移) 當你透過A 成功取得B,且透過B 成功取得C,那麼你也可以透過A 成功取得 C.
Reflexive(反身) 使用A 查詢 A 必定是成功的.
Delegation(代理)
從DELPHI 4 開始,OO PASCAL 就支援Interface Delegation,這種技術使得實作Interface 變的更有彈性,你可以從下面的範例中看出端倪
上面這個範例告訴我們,我們可以指派任何實作了IMyInterface2物件給TmyObject,這就是上面所說的另一種運用.
Property In Interface
DELPHI 6 的Interface 與 Variant
DELPHI 6 支援Custom Variants,這是一個非常有用的特色,但它和Interface 有何關係呢
?
答案並不在Custom Variants 身上,而是在DELPHI 6 重新實作Variants這件事上,因為這個動作,使得我們下面的程式得以正常運作:
答案並不在Custom Variants 身上,而是在DELPHI 6 重新實作Variants這件事上,因為這個動作,使得我們下面的程式得以正常運作:
這段程式碼隱含著一個意義,就是你可以把任何物件轉成IInterface 塞進Variant 中,那對你有何幫助呢? 呵! 我不知道,你慢慢想吧!
給DELPHI 5 使用者
最後......................
文中的程式碼如果可以運作的話,那是我寫的,如果不能的話,那我不知道是誰寫的. :)
转载于:https://blog.51cto.com/programmingart/42950