继承是面向对象开发的的特点之一。良好的继承可以有效的降低代码冗余,提高代码复用。Delphi做为一款优秀的面向对象开发工具,在这一方面也不示弱。当我们在Delphi中新建一个窗体时,可以看到如下代码
type
TForm1=class(TForm)
private
{Privatedeclarations}
public
{Publicdeclarations}
end;
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;
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;
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;
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}
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:LongintreadFTagwriteFTagdefault0;
end;
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:LongintreadFTagwriteFTagdefault0;
end;
注:后三段代码均摘自Delphi的Class.pas单元文件。
版权声明:本文为博主原创文章,未经博主允许不得转载。
相关推荐
2. **继承机制**:在Delphi中,通过在派生窗体的声明中使用`inherits`关键字,可以指定其继承自哪个基类窗体。例如,`TFooForm = class(TBaseForm)`表示`TFooForm`继承自`TBaseForm`。 3. **覆盖或扩展方法**:在...
在VCL中,很多组件都是通过继承机制构建的,这样可以复用代码并保持设计的一致性。例如,TButton类继承自TControl类,从而获得了控件的基本功能,如位置、大小、颜色等属性,同时TButton还添加了与按钮交互相关的...
在面向对象编程中,继承是一种重要的机制,它允许一个类(子类或派生类)继承另一个类(基类或父类)的属性和方法,从而实现代码重用和类的扩展。VCL框架中的许多控件和非控件类都是通过继承自特定的基本类来构建的...
Delphi消息处理机制是Delphi编程中的核心概念,它基于Windows操作系统的消息驱动体系。在Windows系统中,消息传递是程序间交互和控制的主要方式。每当发生用户输入、界面更新或其他事件时,系统都会生成相应消息并放...
《Borland官方Delphi7类属继承图》是一份重要的文档,主要涵盖了Delphi7开发环境中VCL(Visual Component Library)和CLX(Component Library for eXtreme Devices)库的类属继承结构。这份资料对于理解Delphi7的...
在Delphi编程环境中,继承是面向对象编程的一个核心概念,它允许我们创建新的类,这些新类基于已存在的类(称为...通过学习和实践这些示例,开发者可以更好地理解和掌握Delphi中的继承机制,提高编程效率和代码质量。
掌握Delphi的多线程机制,不仅能显著提升程序的性能和响应速度,还能在复杂的应用场景中实现更高效的资源管理和任务调度。希望本文能为Delphi开发者们在多线程编程的道路上提供有益的指导和启示。
Delphi 的内存管理机制和低级别的系统访问能力使其在性能优化方面具有优势,了解如何有效地分配和释放内存,以及避免内存泄漏,是 Delphi 开发中的重要技巧。 9. **网络编程**: Delphi 提供了丰富的网络编程接口...
在Delphi中,它支持类、接口、继承、多态等面向对象特性。了解Object Pascal的基础语法、数据类型、控制结构、异常处理以及面向对象概念是学习Delphi的第一步。 **三、VCL框架** Visual Component Library (VCL)是...
7. **CHAPT17.DOC** - 第十七章可能涵盖多线程编程,讲解如何在Delphi中创建和管理线程,以及同步和通信机制。 8. **CHAPT18.DOC** - 第十八章可能涉及网络编程,包括TCP/IP通信、HTTP协议和套接字编程,以及如何...
手册中的“程序语言手册”部分,主要涵盖了Delphi所基于的Pascal语言的语法和特性。这包括基本的数据类型、变量、常量、运算符、流程控制语句(如if-else、for、while)、函数和过程的定义与调用、异常处理机制等。...
2. **对象导向编程**:Delphi是面向对象的编程语言,手册会深入讲解类、对象、继承、多态和封装等面向对象的概念,以及如何在Delphi中实现这些概念。 3. **组件编程**:Delphi的一大特色是丰富的组件库,如VCL...
在面向对象编程中,继承是一种机制,允许一个类(子类或派生类)继承另一个类(父类或基类)的属性和方法。通过继承,子类可以复用父类的功能,并在其基础上添加新的特性或者覆盖原有行为,以此实现代码的重用和扩展...
在Delphi中,你需要适配这些异常到Delphi的异常处理机制。 9. **性能优化**:了解并应用最佳实践,如延迟加载、批处理更新和优化HQL查询,以提升性能和减少数据库负载。 10. **测试与调试**:使用单元测试框架验证...
- DELPHI中的异常处理机制允许在程序中捕获和处理错误,通过try、except、finally关键字,可以优雅地处理程序可能出现的问题。 8. **组件编程** - 在DELPHI中,许多功能被封装为可视化组件,开发者可以通过拖放...
手册会解释Delphi的异常处理机制,以及如何利用TestComplete或DUnit进行单元测试,确保代码的健壮性。 最后,手册可能会包含一些高级主题,如多线程编程、内存管理和性能优化,这些都是提升Delphi应用性能的重要...
在深入理解Delphi对象机制的过程中,了解参数传递、函数返回值、调用约定以及内联汇编代码的知识是必要的。文件作者通过实际测试和分析汇编代码来探索这些概念,这对于加深理解Delphi的内部工作原理是非常有价值的。...
### 在Delphi中利用多线程实现数据采集的方法 #### 概述 本文档主要介绍了如何在Delphi环境中使用多线程技术实现数据采集的基本原理与实现步骤。Delphi是一种功能强大的开发工具,广泛应用于Windows应用程序开发。...