- 1、本文档共13页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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
您可能关注的文档
最近下载
- 小学研究课题立项申报:基于小学生高阶思维发展的课堂微项目活动设计研究.docx
- 网站安全等级保护--应急预案.docx
- 输送带发展前景分析.pptx
- IPC-6018c,6018cs,6017,6016,6015,6013d,6012e,ds,da 英文资料分享.pdf
- 高中数学公式(经典).doc VIP
- 顶管施工测量方案.doc
- 2024年度医院中医肛肠外科科带教计划课件.pptx
- 全国青少年劳动技能与智能设计大赛赛题与评价标准.PDF
- 2021-2022学年福建省宁德市校际联盟八年级(上)第一次月考英语试卷(附答案详解).docx VIP
- 2023年(最全版)二级建造师考试真题及参考答案.docx
文档评论(0)