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

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
淺談 Interface Wr ite Bcyode6421 多重繼承 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 操作,但在 DELPHI 6 之前的操作較不直覺,因此容易造成 DELPHI 對 Interface 支援不足的假象, 慶幸的是在 DELPHI 6 中這個問題已經被解決了,這也使得 Interface 成為 WebSnap 最重要的部份,同時也在 VCL 中有相當重的戲份, 下面是你最常看到的 Interface 運用: IMyInterface=interface [{FE5A34E5-21AB-4120-971B-FDC3241AD55D}] function SayHello:string; end; TMyObject=class(TInterfacedObject,IMyInterface) function SayHello:string; end; TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private procedure DoSayHello(Intf:IMyInterface); { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} function TMyObject.SayHello:string; begin Result:=Hello; end; procedure TForm1.DoSayHello(Intf:IMyInterface); begin ShowMessage(Intf.SayHello); end; procedure TForm1.Button1Click(Sender: TObject); var Obj:TMyObject; Intf:IMyInterface; begin Obj:=TMyObject.Create; Intf:=(Obj as IMyInterface); DoSayHello(Intf); end; OK,我想這個範例大家都看過了,接下來我們變點不一樣的 type IMyInterface=interface [{FE5A34E5-21AB-4120-971B

文档评论(0)

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

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

认证主体阳新县融易互联网技术工作室
IP属地上海
统一社会信用代码/组织机构代码
92420222MA4ELHM75D

1亿VIP精品文档

相关文档