网站大量收购独家精品文档,联系QQ:2885784924

Interface分析和总结分析和总结.docx

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

淺談Interface

Wr

iteBcyode6421

多重繼承

OOP的重點在於繼承,封裝,多型等概念上,其中以繼承最受爭議,尤其是多重繼承與單一繼承,到目前為止,

至少在實作上許多語言都選擇了單一繼承,原因不外乎多重繼承會將整個物件架

構複雜化,為了保留多重繼承的特性,

Interface(介面)的概念就成為最好的選擇,標準的OO繼承課題就是父母與子女之間的關係,子女繼承了父與母的的特性,

此為多重繼承,但我們都知道,現實上子女並不會擁有父母的所有特性及能力,但

在多重繼承概念上,子可以向上轉型為父,

也可以向上轉型為母,而這就是多重繼承受爭議的地方.圖:多重繼承

由上面的圖我們可以發現,子同時繼承了父與母兩個類別,也就是說子擁有了父與母類別所有的

特性,讓我們以一個較簡單的方式來說,當父類別擁有抽煙的特性,那在多重繼承的觀念下

,子類別必然也有抽煙的特性,但我們都知道這並不是絕對的.因此我們需要讓子

類別選擇是否會抽煙,基於這個理由,

我們得把父類別的抽煙特性定義成可覆載,這樣子類別才能選擇是否會抽煙,

如果這類特性不多的話還好,但多的話就很煩人了,所以多重繼承下的結果,必定是很沉重的.

多重繼承的替代品-Interface

Interfac以e支援某種能力(或擁有某種能力)為主體來取代多重繼承,以上面的類別來定義的話,就如下圖:

圖:以Interfac實e作取代繼承

從上圖來看,你可以發現子直接繼承人類別,而不是繼承父或母,那子類別如何擁有父與母的特性呢?例如子類別要擁有抽煙的能力?

上圖中我們稱之為子類別繼承了人類別並實作了抽煙這個介面,我們也可以說子是個人,擁有抽煙的能力,

這樣的做法是否比上面的多重繼承更符合現實呢?呵,我把這個問題留給你,我可不想再一次陷入論戰中,

回到Interface,基本上Interface也擁有了繼承特性,你可以繼承抽煙這個

Interface,並加入新的特性

圖:Interfa繼ce承

ㄜ…我知道這不太雅,呵,你就將就一下吧:)因此我們重新定義一下父母子的關係

圖:實作繼承的Interface

Interfac繼e承與Class繼承是差不多的,只是Interfac繼e承了定義而非實體類別也可以實作多個Interfac例e,如下圖:

DELPHI(PASCAL) 與Interface

基本上DELPHI支援Interface操作,但在DELPHI6之前的操作較不直覺,因此容易造成DELPHI對Interface支援不足的假象,

慶幸的是在DELPHI 6中這個問題已經被解決了,這也使得Interface成為

WebSnap最重要的部份,同時也在VCL中有相當重的戲份,下面是你最常看到的Interface運用:

IMyInterface=interface

[{FE5A34E5-21AB-4120-971B-FDC3241AD55D}]

functionSayHello:string;end;

TMyObject=class(TInterfacedObject,IMyInterface)functionSayHello:string;

end;

TForm1=class(TForm)Button1:TButton;

procedureButton1Click(Sender:TObject);private

procedureDoSayHello(Intf:IMyInterface);

{Privatedeclarations}public

{Publicdeclarations}end;

var

Form1:TForm1;implementation

{$R*.DFM}

functionTMyObject.SayHello:string;begin

Result:=Hello;end;

procedureTForm1.DoSayHello(Intf:IMyInterface);begin

ShowMessage(Intf.SayHello);end;

procedureTForm1.Button1Click(Sender:TObject);var

Obj:TMyObject;Intf:IMyInterface;

begin

Obj:=TMyObject.Create;Intf:=(ObjasIMyInterface);DoSayHello(Intf);

end;

OK,我想這個範例大家都看過了,接下來我們變點不一樣的

typeIMyInterface=interface

[{FE5A34E5-21AB-4120-97

文档评论(0)

mph + 关注
官方认证
内容提供者

该用户很懒,什么也没介绍

认证主体上海谭台科技有限公司
IP属地上海
统一社会信用代码/组织机构代码
91310115MA7CY11Y3K

1亿VIP精品文档

相关文档