分享
 
 
 

Delphi对象模型(Part I)

王朝delphi·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

Delphi对象模型 (PART I)

Delphi对于面向对象编程的支持丰富而且强大。除了传统的类和对象,Delphi还提供了接口,异常处理,多线程编程等特性。这一章节深入讲解了Delphi的对象模型。读者应当对标准的Pascal比较熟悉,并且对有关面向对象编程的基本法则有一定了解。

(本文的英文原文将Delphi与Object Pascal统一表述为Delphi,可能有概念不清之嫌疑。但在大多数情况下,相信读者能够根据上下文来判定文中所述之Delphi的具体含义——译者注。)

Classes and Objects类和对象

可以将类想象为一种特殊的记录。与记录相似的是,一个类描述的是一种特殊的类型,它由任意多个部分组成,每一个部分称为一个字段。与结构不同的是,一个类可以包含函数和过程(称为方法method),以及属性property。一个类可以继承自另一个类,因此,它继承了祖先类中所有的字段,方法,以及属性。

一个对象(Object)是一个类的动态实例。对象总是从堆中动态分配得来,因此一个对象引用(object refrence)更象一个指针(但是不需要pascal的^操作符)。当你将一个对象引用赋值给一个变量时,Delphi只是复制了指针,而不是复制整个对象实例。程序中不再结束使用一个对象时,应当调用Free方法显式地释放该对象。Delphi没有提供自动的垃圾收集机制(后面一章中的提到的接口除外)。

为简短起见,术语“对象引用”简称为“对象”,但是对象更精确的表述应当是一块内存,Delphi在其中存放该对象的所有字段的值。在Delphi中使用一个对象的唯一方法就是使用对象引用。一个对象引用通常以一个变量的形式存在,但是也有函数或者属性返回值的形式。

类同样是一个独立的实体(与Java中的类似,但与C++中的不同)。在Delphi中,类表现为内存中一张只读的表,表中存放着指向该类的虚方法的指针以及其他许多信息。一个类引用(Class reference)就是指向该表的一个指针。类引用最常见的用法是创建一个对象或者用来测试一个对象引用的类型,也可以在其它许多场合使用。比如,传递类引用给某个例程或者从一个函数中返回一个类引用。类引用的类型称为元类(metaclass)。

例2-1显示了几个类的声明。类的声明以关键字Class开头。类的声明中包含字段(field),方法(method),属性(property)等部分,以关键字End结尾。每一个方法的声明类似于forword前导声明,你必须在同一单元中实现它(抽象abstract方法除外,有关抽象方法的内容将在后面提到)。

type

TAccount = class

private

fCustomer: string; // name of customer

fNumber: Cardinal; // account number

fBalance: Currency; // current account balance

end;

TSavingsAccount = class(TAccount)

private

fInterestRate: Integer; // annual percentage rate, scaled by 1000

end;

TCheckingAccount = class(TAccount)

private

fReturnChecks: Boolean;

end;

TCertificateOfDeposit = class(TSavingsAccount)

private

fTerm: Cardinal; // CD maturation term, in days

end;

var

CD1, CD2: TAccount;

begin

CD1 := TCertificateOfDeposit.Create;

CD2 := TCertificateOfDeposit.Create;

...

图2-1描述了例2-1中的对象和类在内存中的存放结构。变量以及相关对象存放于可读写的内存中。类存放在只读的内存中,与程序码放在一起。

[/url] Figure 2.1

Delphi的对象模型与其他几个面向对象语言的类似,比如C++和Java。表2-1显示了Delphi与其他几种流行的编程语言的简要对比。

Table 2-1: Delphi Versus the World

语言特性

Delphi

Java

C++

Visual Basic

继承

多重继承

接口

[url=http://www.delphi3000.com/articles/article_988.asp#footnote-1][1]

单根类

元类

类(静态)字段

虚方法

抽象(纯)虚方法

类(静态)方法

动态方法

垃圾回收

[2]

[2]

可变类型

OLE自动化

静态类型校验

异常处理

函数(过程)重载

操作符重载

非类函数

非对象变量

属性

RTTI(运行期类型信息)

[3]

Generic类型(模板)

嵌入式线程支持

消息传递

嵌入式汇编

[4]

单行函数

我们将在以下几节中详细讨论这些语言特性。

类(Class)

类的声明描述了该类所包含的字段(Field),方法(Method),以及属性(Property)等信息。你可以在单元的interface或者implementation部分声明一个类,但是方法(method)——与函数或过程类似——必须得在implementation部分定义。同时,你必须在该类声明的同一单元内实现该方法。

类可以声明分为一个或多个部分,允许每一部分有不同的访问级别(可以是私有的private,受保护的protected,公开的public,发布的published以及自动的automated等)。有关访问级别的内容将在后面谈及。你甚至可以将各个声明部分任意排列,并且,允许相同的访问级别重复出现。

在声明的每一部分中,你可以定义任意多的字段,跟在方法和属性的声明后面。方法和属性的声明可以混在一起,但是在同一部分中所有字段必须声明在方法之前。与Java和C++不同,Delphi中不能在类声明中嵌套其他任何类型的声明。

类只有单一的基类,类从基类中继承所有字段,属性和方法。假如你不明确指明基类,Delphi自动使用TObject作为基类。类可以实现任意多的接口。因而Delphi的对象模型与Java的极为类似,即一个类可以对一个简单的类进行扩展并且实现多重接口。

提示:

在Delphi中有个约定,类型名称通常以字母T打头,如TObject。不过这只是一个约定而不是语法规则。并且,IDE也通常以一个T开头来命名一个类。

类引用是对一个特定的类的一种引用。类引用并不是一个类对象(在Jave和SmallTalk中如此),但它可以用来创建新的对象,调用类方法,以及测试或试验对象的类型。类引用以指针的方式实现,这个指针指向有关该类信息的一张表,包括类的虚拟方法表(VMT)。(参见第三章“VMT中到底有些什么”相关内容。)

类引用最通常的用法是调用该类的构造器constructor来创建一个对象实例。也可以使用类引用来检测对象的类型(使用Is操作符)。通常情况下,类引用是一个类名,但也可以是一个元类(metaclass)类型的变量,或者函数和属性的返回值。

例2-2:声明一个类以及元类

type

TComplexClass = class of TComplex; //元类类型

TComplex = class(TPersistent)

private

fReal, fImaginary: Double;

public

constructor Create(Re: Double = 0.0); overload;

constructor Create(Re, Im: Double); overload;

destructor Destroy; override;

procedure Assign(Source: TPersistent); override;

function AsString: string;

published

property Real: Double read fReal write fReal;

property

end;

PartII

PartIII

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有