多重繼承<?XML:NAMESPACE PREFIX = O />


     

     

     

     

     

     

     

:多重繼承


<?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 必定是成功的.

 

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這件事上,因為這個動作,使得我們下面的程式得以正常運作:


     


     


     


     

這段程式碼隱含著一個意義,就是你可以把任何物件轉成IInterface 塞進Variant ,那對你有何幫助呢? ! 我不知道,你慢慢想吧!

DELPHI 5 使用者


     


     


     


     

最後......................

文中的程式碼如果可以運作的話,那是我寫的,如果不能的話,那我不知道是誰寫的. :)