`
禹爸爸
  • 浏览: 80465 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Delphi中的继承机制

阅读更多

继承是面向对象开发的的特点之一。良好的继承可以有效的降低代码冗余,提高代码复用。Delphi做为一款优秀的面向对象开发工具,在这一方面也不示弱。当我们在Delphi中新建一个窗体时,可以看到如下代码

type
TForm1
=class(TForm)
private
...{Privatedeclarations}
public
...{Publicdeclarations}
end;

这表示我们建立的所有窗体都是继承自TForm这个类。如果我们希望在某个项目中所有的窗体都具有相同的风格和字体标准,大不必为每个窗体一一指定,只需要定义一个标准的窗体作为项目中所有窗体的基类就可以了,这样我们只要在这个基类的窗体中定义窗体风格和字体标准即可应用到所有它的子类窗体中。假设我们设计一个MDI项目,希望所有的MDI窗体都具有相同的界面布局,就可以先建立一个MDI窗体基类,然后让所有的MDI窗体都从此类派生,而非TForm类。

TfrmMDIBase=class(TForm)
CoolBar1:TCoolBar;
ToolBar1:TToolBar;
ToolButton1:TToolButton;
ToolButton2:TToolButton;
ToolButton3:TToolButton;
ToolButton4:TToolButton;
ToolButton5:TToolButton;
dsActive:TDataSource;
ToolButton6:TToolButton;
ToolButton7:TToolButton;
ToolButton8:TToolButton;
ToolButton9:TToolButton;
ToolButton10:TToolButton;
ActionList1:TActionList;
DataSetFirst1:TDataSetFirst;
DataSetPrior1:TDataSetPrior;
DataSetNext1:TDataSetNext;
DataSetLast1:TDataSetLast;
DBGridEh1:TDBGridEh;
aqActive:TADOQuery;
actNew:TAction;
actEdit:TAction;
actExit:TAction;
actDelete:TAction;
ToolButton11:TToolButton;
actRefresh:TAction;
Panel1:TPanel;
pnlEdit:TPanel;
actCancel:TAction;
ToolButton12:TToolButton;
actSave:TAction;
ToolButton13:TToolButton;
procedureFormClose(Sender:TObject;varAction:TCloseAction);
procedureFormCreate(Sender:TObject);
procedureactNewExecute(Sender:TObject);
procedureactDeleteExecute(Sender:TObject);
procedureactExitExecute(Sender:TObject);
procedureactNewUpdate(Sender:TObject);
procedureactDeleteUpdate(Sender:TObject);
procedureactExitUpdate(Sender:TObject);
procedureaqActiveAfterInsert(DataSet:TDataSet);
procedureactRefreshUpdate(Sender:TObject);
procedureactRefreshExecute(Sender:TObject);
procedureactCancelExecute(Sender:TObject);
procedureactCancelUpdate(Sender:TObject);
procedureactSaveExecute(Sender:TObject);
procedureactSaveUpdate(Sender:TObject);
procedureaqActivePostError(DataSet:TDataSet;E:EDatabaseError;
varAction:TDataAction);
private
...{Privatedeclarations}
procedureOpenDataSet;
procedureCloseDataSet;
protected
public
...{Publicdeclarations}
end;

在子类中,可以使用关键字Override改写祖先类中使用Virtual关键字声明虚方法。如果在改写的方法只是想在父类的执行之后增加些自己的处理,而不是完全覆盖掉父类中的代码,可以使用inherited关键字。

destructorTCollectionItem.Destroy;
begin
SetCollection(nil);
inheritedDestroy;
end;

点型的用法就是在李维的《Inside VCL(深入核心--VCL架构剖析》一书中曾提到过的三明治法。

destructorTStringList.Destroy;
begin
FOnChange:
=nil;
FOnChanging:
=nil;
inheritedDestroy;
ifFCount<>0thenFinalize(FList^[0],FCount);
FCount:
=0;
SetCapacity(
0);
end;

在Delphi中没有像C++那样的多继承,即每个类只可以有一个父类。不过在Delphi中也可以通过接口(Interface)来实现这种多继承,确切的说这并不是多继承,只是看起来像是多继承。如Delphi中的所有组件的祖先类TComponent。

TComponent=class(TPersistent,IInterface,IInterfaceComponentReference)
private
............
...{IInterfaceComponentReference}
functionIInterfaceComponentReference.GetComponent
=IntfGetComponent;
functionIntfGetComponent:TComponent;
protected
............
...{IInterface}
functionQueryInterface(constIID:TGUID;outObj):HResult;virtual;stdcall;
function_AddRef:Integer;stdcall;
function_Release:Integer;stdcall;

...{IDispatch}
functionGetTypeInfoCount(
outCount:Integer):HResult;stdcall;
functionGetTypeInfo(Index,LocaleID:Integer;
outTypeInfo):HResult;stdcall;
functionGetIDsOfNames(
constIID:TGUID;Names:Pointer;
NameCount,LocaleID:Integer;DispIDs:Pointer):HResult;stdcall;
functionInvoke(DispID:Integer;
constIID:TGUID;LocaleID:Integer;
Flags:Word;varParams;VarResult,ExcepInfo,ArgErr:Pointer):HResult;stdcall;

public
constructorCreate(AOwner:TComponent);
virtual;
destructorDestroy;
override;
............

propertyComObject:IUnknownreadGetComObject;

propertyComponents[Index:Integer]:TComponentreadGetComponent;
propertyComponentCount:IntegerreadGetComponentCount;
propertyComponentIndex:IntegerreadGetComponentIndexwriteSetComponentIndex;
propertyComponentState:TComponentStatereadFComponentState;
propertyComponentStyle:TComponentStylereadFComponentStyle;
propertyDesignInfo:LongintreadFDesignInfowriteFDesignInfo;
propertyOwner:TComponentreadFOwner;

propertyVCLComObject:PointerreadFVCLComObjectwriteFVCLComObject;

published
propertyName:TComponentNamereadFNamewriteSetNamestoredFalse;
propertyTag:LongintreadFTagwriteFTag
default0;
end;

 

注:后三段代码均摘自Delphi的Class.pas单元文件。

版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

    Delphi模式编程第一分卷

    第2章 Delphi的模式编程机制 2.1 对象模型机制 2.1.1 对象模型 2.1.2 对象建模和模式编程 2.1.3 对象关系与复用 2.2 动态绑定机制 2.2.1 方法绑定 2.2.2 虚方法 2.2.3 多态 2.3 类型转换机制 2.3.1 类型 ...

    Delphi模式编程第二分卷

    第2章 Delphi的模式编程机制 2.1 对象模型机制 2.1.1 对象模型 2.1.2 对象建模和模式编程 2.1.3 对象关系与复用 2.2 动态绑定机制 2.2.1 方法绑定 2.2.2 虚方法 2.2.3 多态 2.3 类型转换机制 ...

    零点起航Delphi7基础教程源码

    10.3 Delphi访问数据库的机制 10.4 Delphi的数据库管理工具 10.5 建立第一个数据库应用程序 10.6 小结 第11章 开发数据库应用程序 11.1 数据集组件 11.2 数据控制组件 11.3 人事管理系统开发 11.4 小结 第...

    详细描述了Delphi多线程编程,超级简单易懂

    在Delphi中,多线程可以通过多种方式实现,包括使用TThread类、动态线程变量、线程同步机制等。 TThread类是Delphi中进行多线程编程的核心,它封装了创建和控制线程所需的方法和属性。开发者可以通过继承TThread类并...

    fastreport VCL 5.0_for d7 最新报表安装版支持自带QR等二维码

    在导出TIFF中新增多重图象机制 为导出在UTDF8为导出CSV过滤器添加新属性使用UTF8编码存储Unicode文本 为新类增加RTTI信息 改善、修复模版继承问题 优化导出为PDF的复选框 漏洞修复: 修复脚本继承功能 修复导出为...

    《程序设计大学教程试读》PDF版

    1798.2 继承 1838.2.1 使用继承 1848.2.2 继承与合成 1918.3 多态 1938.3.1 多态与动态绑定 1938.3.2 方法的覆盖、隐藏和重载1968.4 接口 1988.4.1 接口的概念 1988.4.2 Delphi对象接口 1998.4.3 接口应用实例 2038....

    第一章JAVA面向对象的程序设计.doc

    面向对象的程序设计思想:以对象作为基本单位,以消息为驱动,事件模型为处理机制。 4:以后发展:基于组件(构件模型)、以中间件作为程序的构加基础等等,实现软件标准化 5:面向对象语言:C++、VB、Delphi及JAVA...

    C#微软培训资料

    14.1 C#的继承机制.155 &lt;&lt;page 3&gt;&gt; page begin==================== 14.2 多 态 性 .159 14.3 抽象与密封 .163 14.4 继承中关于属性的一些问题.169 14.5 小 结 .172 第四部分 深入了解 C#.174 第十...

    高等学校教材管理系统的设计与实现_

    在C#环境下,利用事件驱动的编程机制、新颖易用的可视化设计工具,使用Windows内部的应用程序接口(API)函数,以及动态链接库(DLL)、动态数据交换(DDE)、对象的链接与嵌入(OLE)、开放式数据访问(ODBC)等技术,可以...

    易语言程序免安装版下载

    修改BUG:VCL相关支持库部分组件在修改个别属性或调用个别方法后不可见,并改进了Delphi版本的支持库SDK。 15. 修改BUG:高级表格在列类型为数值型时,添加新行且省略标题的情况下,会导致程序异常。 16. 修改BUG...

    编程新手真言......

    3.12 类VB,DELPHI类RAD语言分析 82 第4章 语言最小内核(C) 83 4.1 C与C++是二种不同的语言 83 4.2 C的数组,指针与字符串 84 4.3 C的输入与输出流 84 4.4 C的类型系统与表达式 85 4.5 二进制指令看循环 85 4.6 所谓...

    Python 2.5

    在Python下创建对象,你可以比我们知道的任何语言用更短的代码和更少的时间,并且全部支持继承,密封和多形性。一个比较流行的办法是在Python中原型一个程序,直到你相信设计是正确的再换到C++中,一个更好的办法是...

Global site tag (gtag.js) - Google Analytics