`
com1com4
  • 浏览: 161641 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Delphi笔记(整理)-类

阅读更多
一个类声明有如下格式
type className = class (ancestorClass)
memberList
end;

在类声明中,方法看起来就像函数(或过程)头,而没有函数(或过程)体。方法的定义出现在程序的
其它地方。比如,这里是Classes 单元中TMemoryStream 类的声明
type
TMemoryStream = class(TCustomMemoryStream)
private
FCapacity: Longint;
procedure SetCapacity(NewCapacity: Longint);
protected
function Realloc(var NewCapacity: Longint): Pointer; virtual;
property Capacity: Longint read FCapacity write SetCapacity;
public
destructor Destroy; override;
procedure Clear;
procedure LoadFromStream(Stream: TStream);
procedure LoadFromFile(const FileName: string);
procedure SetSize(NewSize: Longint); override;
function Write(const Buffer; Count: Longint): Longint; override;
end;

除了TObject,System 单元还声明了一个类引用类型TClass。

类和它的祖先类是赋值兼容的,所以,某个类类型的变量能引用它的任何子类类型的实例。

除了类类型,你可以使用如下语法声明一个object 类型
type objectTypeName = object (ancestorObjectType)
memberList
end;

Object 类型不能有published 成员。因为object 类型不是从TObject 继承,它们没有内置的构造函数和析构函数,也没有其它方法。
你能使用New 过程创建Object 类型的实例,并使用Dispose 过程销毁它们,你也可以像使用记录一样,采用简
单方式声明object 类型的变量。Object 类型只是为了向后兼容性,不推荐使用它们。

类的每个成员都有一个称为可见性的属性,用下面的关键字之一来表示它:private、protected、public、published 和automated。
private表示最小程度的访问能力,protected 表示中等程度的访问能力,public、published 和automated 表示最大程度的访问能力。

若声明一个成员时没有指定其可见性,则它和前面的成员拥有相同的可见性;若在类声明的开始没有指
定可见性,当在{$M+}状态下编译类时(或者继承自一个在{$M+}状态下编译的类),它的默认可见性是
published,否则,它的可见性是public。

通过重新声明,你可以在派生类中增大一个成员的可见性,但你不能降低它的可见性。比如,一个protected
属性在派生类中能被改变为public,但不能改为private。还有,published 成员在子类中不能改为public。

若声明一个类时以class 和分号结束,也就是有下面的格式,
type className = class;
在class 后面没有列出父类,也没有成员列表,这是一个forward 声明。Forward 声明的类必须在同一个
声明区域进行定义声明,换句话说,在forward 声明和它的定义声明之间除了类型声明外,不能有任何
其它内容。

虽然类声明既可以出现在单元的interface 部分,也可以出现在implementation 部分,但类方法的实现(定
义声明)必须出现在implementation 部分。

。指示字应当只出现在类声明中,并且以下面的顺序列出:
reintroduce; overload; binding; calling convention; abstract; warning
这里,binding 是virtual、dynamic 或override;calling convention 是register、pascal、cdecl、stdcall 或
safecall;warning 是platform、deprecated 或library。

关键字inherited 在实现多态行为时扮演着特殊角色,它出现在方法定义中,后面跟一个标志符或者不跟。

方法分为静态方法(默认)、虚方法和动态方法。虚方法和动态方法能被覆盖,它们可是是抽象的。

方法默认是静态的。

要实现虚方法或动态方法,在声明时包含virtual 或dynamic 指示字。不像静态方法,虚方法和动态方
法能在派生类中被覆盖。当调用一个被覆盖的方法时,类或对象的实际类型决定了哪种实现被调用(运
行时),而不是它们被声明的类型。
要覆盖一个方法,使用override 指示字重新声明它就可以了。声明被覆盖的方法时,它的参数的类型和
顺序以及返回值(若有的话)必须和祖先类相同。

只有虚方法和动态方法能被覆盖,但是,所有方法都能被重载

虚方法和动态方法在语义上是相同的,唯一的不同是在运行时决定方法调用的实现方式上,虚方法在速
度上进行了优化,而动态方法在代码大小上做了优化。

在声明方法时,如果它和继承的方法具有相同的名称和参数,但不包含override,则新方法仅仅是隐藏
了继承下来的方法,并没有覆盖它。这样,两个方法在派生类中都存在,方法名是静态绑定的。

reintroduce 指示字告诉编译器,当隐藏一个先前声明的虚方法时,不给出警告信息。比如,
procedure DoSomething; reintroduce; // 父类也有一个DoSomething 方法
当要使用新方法隐藏继承下来的虚方法时,使用reintroduce 指示字。

抽象方法是虚方法或动态方法,并且在声明它的类中没有实现,而是由它的派生类来实现。声明抽象方
法时,必须在virtual 或dynamic 后面使用abstract 指示字。比如,
procedure DoSomething; virtual; abstract;
只有当抽象方法在一个类中被覆盖时,你才能使用这个类或它的实例进行调用。

一个方法可以使用overload 指示字来重新声明,此时,若重新声明的方法和祖先类的方法具有不同的参
数,它只是重载了这个方法,并没有隐藏它。当在派生类中调用此方法时,依靠参数来决定到底调用哪
一个。
若要重载一个虚方法,在派生类中重新声明时使用reintroduce 指示字。

在一个类中,你不能以相同的名字公布(published)多个重载的方法,维护RTTI 信息要求每一个公布
的成员具有不同的名字。

作为属性读写限定符的方法不能被重载。
实现重载的方法时,必须重复列出类声明时方法的参数列表。

按惯例,构造函数通常命名为Create
constructor Create;
constructor Create(AOwner: TComponent);

Message 方法用来响应动态分派的消息。Message 方法在各个平台上都是支持的,VCL 使用message 方
法来响应Windows 消息,CLX 不使用message 方法来响应系统事件。

比如,在Windows 下:
type
TTextBox = class(TCustomControl)
private
procedure WMChar(var Message: TWMChar); message WM_CHAR;
...
end;

消息处理函数很少直接调用,相反,消息是通过继承自TObject 的Dispatch 方法来分派给对象的。
procedure Dispatch(var Message);
传给Dispatch 的参数Message 必须是一个记录,并且它的第一个字段是Cardinal 类型,用来存储消息号
码。
Dispatch 按类的层次结构向后搜索(从调用对象所属的类开始),它将调用和传给它的消息具有相同号码
的message 方法。若没有发现指定号码的message 方法,Dispatch 调用DefaultHandler。

比如,给定下面的声明
property Color: TColor read GetColor write SetColor;
GetColor 方法必须被声明为:
function GetColor: TColor;
SetColor 方法必须被声明为下面之一:
procedure SetColor(value: TColor);
procedure SetColor(const value: TColor);
(当然,SetColor 的参数名不必非得是value。)

数组属性是被索引的属性,它们能表示像下面的一些事物:列表中的条目、一个控件的子控件和位图中
的象素等等。
声明数组属性时包含一个参数列表,它指定索引的名称和类型,比如,
property Objects[Index: Integer]: TObject read GetObject write SetObject;
property Pixels[X, Y: Integer]: TColor read GetPixel write SetPixel;
property values[const Name: string]: string read Getvalue write Setvalue;

定义数组属性时可以在后面使用default 指示字,此时,数组属性变成类的默认属性。
若一个类有默认属性,你能使用缩写词object[index]来访问这个属性,它就相当于object.property[index]。

索引限定符能使几个属性共用同一个访问方法来表示不同的值。
若一个属性有索引限定符,它的读写限定符必须是方法而不能是字段。

可选指示字stored、default 和nodefault 被称为存储限定符,它们对程序的行为没有影响,但决定了RTTI
的维护方式,它们决定是否把公布属性的值存储到窗体文件中。

stored 指示字后面必须跟True、False、Boolean 类型的字段名或者一个返回Boolean 值的无参数方法。
比如,
property Name: TComponentName read FName write SetName stored False;
若一个属性没有stored 指示字,就相当于指定了stored True。
default 指示字后面必须跟随一个和属性具有相同类型的常量,比如,
property Tag: Longint read FTag write FTag default 0;
要覆盖一个继承下来的默认值而不指定新值,使用nodefault 指示字。default 和nodefault 只支持有序类
型和集合类型(当它的基础类型是有序类型,并且上下边界都在0 到31 之间时)。若声明属性时没有使
用default 或者nodefault,它被当作nodefault 看待。对于实数、指针和字符串,它们分别有隐含的默认
值0、nil 和 ’ ’(空串)

声明时没有指定类型的属性称为属性覆盖,它允许你改变一个属性继承下来的可见性或限定符。

类引用类型有时称为元类,用如下的构造形式表示 class of type

每个类从TObject 继承了两个分别叫做ClassType 和ClassParent 的方法,前者返回对象的类引用,后者
返回对象的父类类引用。这两个方法的返回值都是TClass(这里TClass = class of TObject)类型,它们
能被转换为更加明确的类型。每个类还继承了一个叫做InheritsFrom 的方法,它测试调用的对象是否从
一个指定的类派生而来(如果对象是类的一个实例,结果如何?)。这些方法被is 和as 运算符使用,很
少直接调用它们。

is 运算符执行动态类型检查,用来验证运行时一个对象的实际类型。
object is class

as 运算符执行受检查的类型转换。表达式
object as class

类方法是作用在类而不是对象上面的方法(不同于构造函数)。类方法的定义必须以关键字class 开始,
比如,
type
TFigure = class
public
class function Supports(Operation: string): Boolean; virtual;
class procedure GetInfo(var Info: TFigureInfo); virtual;
...
end;
类方法的定义部分也必须以class 开始,比如,
class procedure TFigure.GetInfo(var Info: TFigureInfo);
begin
...
end;

<Leo>类方法类似C++/C#里的static成员????

类方法既可以通过类引用来调用,也可以使用对象,当使用后者时, Self 值等于对象所属的类。

要创建一个异常对象,在raise 语句中调用异常类的构造函数。比如,
raise EMathError.Create;
通常,raise 语句的格式是
raise object at address
这里,object 和at address 都是可选的。

异常在try...except 语句中被处理,比如,
try
X := Y/Z;
except
on EZeroDivide do HandleZeroDivide;
end;

SysUtils 单元声明了几个标准例程来处理异常,它们包括ExceptObject、ExceptAddr 以及ShowException。
分享到:
评论

相关推荐

    Delphi笔记本+源碼(access数据库)

    在Delphi笔记本中,Access数据库被用作后端数据存储,用于保存用户的笔记内容、类别信息等。开发者使用ADO(ActiveX Data Objects)或DCOM(Distributed Component Object Model)技术,将Delphi应用程序与Access...

    delphi 学习笔记

    ### Delphi学习笔记:遍历文件与获取特定扩展名文件 #### 一、知识点概述 在本篇Delphi学习笔记中,我们主要探讨了如何利用Delphi编程语言来实现文件系统的遍历,并筛选出特定扩展名的所有文件。该功能对于需要...

    delphi笔记

    《Delphi笔记——深入探索与实践》 Delphi,这个由Borland公司开发的集成开发环境(IDE),因其高效、强大的对象 Pascal 编程语言和丰富的组件库,长期以来深受程序员喜爱。它不仅适合快速开发桌面应用程序,还能...

    delphi,jquery,mysql学习笔记

    学习笔记是个人学习过程中整理的重要资料,对于初学者尤其有价值。通过阅读这些笔记,你可以了解作者在学习过程中遇到的问题、解决方法和心得体会。笔记可能涵盖了一些实例代码、关键概念的解释、常见问题的解答等,...

    Delphi逆向工程笔记

    看雪论坛上搜集的资料,将其整理成CHM文档

    读书笔记源码 Delphi6编译 学英语的好助手

    标题中的"读书笔记源码 Delphi6编译 学英语的好助手"揭示了这是一个使用Delphi6编程环境编写的软件项目,主要用于辅助学习英语。Delphi6是一款基于Object Pascal语言的集成开发环境(IDE),在20世纪末到21世纪初...

    读书笔记 (文档收藏夹)

    标题 "读书笔记 (文档收藏夹)" 提供的信息表明这是一个用以整理和管理技术文档的应用程序,可能是由初学者使用 DELPHI 编程语言开发的。描述中提到,开发者为了解决技术文档的收藏问题而创建了这个软件,并且特别...

    JAVA,C#,Delphi,系统相关技术笔记

    转向Windows系统优化,这部分笔记可能包含以下主题:注册表清理、磁盘碎片整理、服务管理、启动项优化、网络设置调整以及电源管理策略。此外,你可能还会学习到如何使用Windows内置的性能监视器(PerfMon)和其他...

    Delphi-stuff:杂碎的东西,一会儿我会尝试整理

    在 Delphi 中,Pascal 语言被扩展以支持面向对象编程,包括类、继承、多态等特性。 2. **Delphi IDE**:Delphi 的集成开发环境提供了丰富的工具和功能,如代码编辑器、调试器、项目管理器和组件面板。这些工具帮助...

    014_《Delphi高手突破》(附书源码)

    3. **异常处理**:exception文件可能涵盖了Delphi中的错误处理机制,包括Try...Except...Finally语句的使用,异常类的层次结构,以及如何有效地抛出和捕获异常。 4. **继承**:inherit目录可能包含了关于面向对象...

    Delphi学习资料

    通过系统地学习CHM文件,结合NoteBook.exe进行笔记整理,同时利用delphi.qi中的代码片段,你将能够更加熟练地掌握Delphi,成为一名出色的Delphi开发者。在探索Delphi的世界中,不断地实践、积累和创新,你会发现编程...

    软考中级-信息系统管理工程师复习笔记(干货)

    根据提供的信息,复习笔记涵盖了信息系统管理工程师所需了解的计算机基础知识和原理,包括但不限于硬件基础知识、系统结构、存储系统和多种数据处理概念。以下是详细知识点的整理和阐述: 1. 计算机硬件基础知识 ...

    大富翁论坛索引1998-2009

    历年都有不少网友加工整理和发布各种形式的离线数据包及离线数据查询阅读工具,感兴趣的网友可在本站中搜索得到。 本CHM为所有CHM资料总索引,可以使用搜索功能搜索所有CHM中的资料。 使用方法:请将本索引CHM与...

    delphi技巧管理程序

    1. **分类管理**:允许用户根据技巧的主题或类别进行整理,如GUI设计、数据库交互、多线程编程等,便于快速找到所需信息。 2. **搜索功能**:内置搜索引擎,使用户可以通过关键词快速定位到特定技巧,提高工作效率...

    最新的超级猛料包 (2005-03-29)

    【标题】"最新的超级猛料包 (2005-03-29)" 提供的是2005年3月29日发布的最新资源集合,这个压缩包以"Mybase"格式组织,Mybase是一款强大的个人信息管理软件,常用于存储笔记、文档、项目资料等,以树形结构进行组织...

    截图识别文字软件

    - 笔记整理:在学术研究或会议记录中,可以快速将纸质资料或白板上的文字转换成电子版,方便整理和分享。 - 多语言支持:现代的OCR软件通常能识别多种语言,满足不同语境下的需求。 - 自定义设置:用户可以根据自己...

    UniGui开发资料集合.rar

    2. "我收集的 unigui 资料.doc":这可能是一个个人整理的文档,包含了作者在使用UniGui过程中积累的经验、技巧或者常见问题的解决方案。 3. "unigui代码技巧收集.doc":这份文档很可能汇总了各种与UniGui相关的编程...

    天草<>全部1-58课的视频

    天草壳的世界全部1-58课的视频,包含课件和部分笔记。早期破解逆向脱壳大神的培训课程资料,学习后对付一般的脱壳,绰绰有余。解压密码请查看压缩包中的文件名。

    学习秘书 (ADO+ACCESS)

    在"学习秘书"中,ACCESS数据库可能被用于存储用户的文本资料,如文章、笔记、报告等,通过数据库结构化的形式,便于用户按类别、关键词等条件快速查找和整理信息。 在压缩包内的文件列表中,我们看到的是DELPHI项目...

    2013河北职称计算机考试基础知识整理(小字打印版).doc

    这篇文档主要整理了2013年河北省职称计算机考试的基础知识,涵盖了计算机应用、软件法律、多媒体、数码产品选购等多个方面。以下是对这些知识点的详细解释: 1. 软件分类:免费软件指的是可以无偿使用的软件,商业...

Global site tag (gtag.js) - Google Analytics