Delphi对象模型(Part VI)
2008-05-01 00:01
162 查看
Interfaces接口
接口定义了包含一组抽象方法的类型。一个类,即使是自一个简单的基类继承而来也可以实现任意多的借口。接口与抽象类有些相似(即没有任何字段并且所有方法都是抽象方法的类),并且Referencecounting引用计数
编译器触发对_AddRef和_Release的调用以管理接口对象的生命周期。要使用Typecasting类型转换
type
TNoRefCount=class(TObject,IUnknown)
protected
functionQueryInterface(constIID:TGUID;outObj):HResult;stdcall;
function_AddRef:Integer;stdcall;
function_Release:Integer;stdcall;
end;
functionTNoRefCount.QueryInterface(constIID:TGUID;outObj):HResult;
begin
ifGetInterface(IID,Obj)then
Result:=0
else
Result:=Windows.E_NoInterface;
end;
functionTNoRefCount._AddRef:Integer;
begin
Result:=-1
end;
functionTNoRefCount._Release:Integer;
begin
Result:=-1
end;
Interfacesandobject-orientedprogramming接口和面向对象编程
接口最重要的作用就是将类型继承(typeinheritance)与类继承(classinheritance)分开。类继承是代码重用的一项有效的工具。派生的类轻松的继承了基类的字段,方法以及属性,并且不需要重新实现公用的方法。在一个强类型的语言中,比如COM编程的一个约定是将接口的名称命名为I打头的。
type
IShape=interface
['{50F6D851-F4EB-11D2-88AC-00104BCAC44B}']
procedureDraw(Canvas:TCanvas);
functionGetPosition:TPoint;
procedureSetPosition(Value:TPoint);
propertyPosition:TPointreadGetPositionwriteSetPosition;
end;
IPolygon=interface(IShape)
['{50F6D852-F4EB-11D2-88AC-00104BCAC44B}']
functionNumVertices:Integer;
functionNumSides:Integer;
functionSideLength(Index:Integer):Integer;
functionVertex(Index:Integer):TPoint;
end;
IRectangle=interface(IPolygon)
['{50F6D853-F4EB-11D2-88AC-00104BCAC44B}']
end;
ISquare=interface(IRectangle)
['{50F6D854-F4EB-11D2-88AC-00104BCAC44B}']
functionSide:Integer;
end;
TBaseShape=class(TNoRefCount,IShape)
private
fPosition:TPoint;
functionGetPosition:TPoint;
procedureSetPosition(Value:TPoint);
public
constructorCreate;VIrtual;
procedureDraw(Canvas:TCanvas);VIrtual;abstract;
propertyPosition:TPointreadfPositionwriteSetPosition;
end;
TPolygon=class(TBaseShape,IPolygon)
private
fVertices:arrayofTPoint;
public
procedureDraw(Canvas:TCanvas);override;
functionNumVertices:Integer;
functionNumSides:Integer;
functionSideLength(Index:Integer):Integer;
functionVertex(Index:Integer):TPoint;
end;
TRectangle=class(TBaseShape,IPolygon,IRectangle)
private
fRect:TRect;
public
procedureDraw(Canvas:TCanvas);override;
functionNumVertices:Integer;
functionNumSides:Integer;
functionSideLength(Index:Integer):Integer;
functionVertex(Index:Integer):TPoint;
end;
TSquare=class(TBaseShape,IPolygon,IRectangle,ISquare)
private
fSide:Integer;
public
procedureDraw(Canvas:TCanvas);override;
functionSide:Integer;
functionNumVertices:Integer;
functionNumSides:Integer;
functionSideLength(Index:Integer):Integer;
functionVertex(Index:Integer):TPoint;
end;派生类继承了祖先类实现的接口。TRectangle继承自TBaseShape,则TBaseShape实现了IShape接口也就是TRectangle实现了IShape接口。而接口的继承与此有些不同。接口的继承仅仅为了类型上的便利,也就是说你不必重新再去输入许多方法的声明。当一个类实现一个接口时,并不意味着该类自动的实现了祖先的接口。事实上,该类只实现了出现在该类的声明部分的这些接口(以及在祖先类的声明部分出现的接口)。因此,即使IRectangle继承自IPolygon,TRectangle类还是得将IRectangle和IPolygon显式的罗列出来。要实现类型体系,你不应当使用引用计数。相反,你需要实现显式的内存管理,如同处理普通的
相关文章推荐
- Delphi对象模型(Part VI)
- Delphi对象模型(Part III)
- Delphi对象模型(Part IV)
- Delphi对象模型(Part II)
- Delphi 对象模型学习笔记
- Delphi对象模型(Part I)
- Delphi对象模型(Part IV)
- Delphi对象模型(Part V)
- Delphi 对象模型学习笔记
- Delphi 对象模型学习笔记
- Delphi对象模型(Part I)
- ASP.NET 页面对象模型
- 2013(秋季)CocoaChina开发者大会实录及PPT:沈熙《脚本语言JavaScript与C/C++对象模型的绑定
- ASP.NET 页面对象模型(page)
- 《GOF设计模式》—桥接(BRIDGE)—Delphi源码示例:创建正确的Implementor对象(缺省的实现)
- 探讨C#2.0对象模型
- ASP.NET 页面对象模型(转载)
- SharePoint高级内容--访问群体对象模型的开发之一
- SharePoint 2010中开发模式的改进 COM - 客户端对象模型
- Sharepoint学习笔记—ECMAScript对象模型--实现编写代码时的智能提示功能