Delphi对象模型(Part IV)
2008-05-01 00:01
176 查看
ObjectLifeCycle对象的生命周期
对于绝大多数对象,你调用构造器创建它,使用它,然后调用Free将它释放。type
TSomething=class
procedureDoSomething;
end;
var
Ref:TSomething;
begin
Ref:=TSomething.Create;
Ref.DoSomething;
Ref.Free;
end;
//在构造器中被隐藏代码类似于这样:
functionTSomething.Create(IsClassRef:Boolean):TSomething;
begin
ifIsClassRefthen
try
//获得新的对象实例
Self:=TSomething.NewInstance;
//NewInstance初始化对象,功能与InitInstance类似。假如你覆盖了NewInstance,那么,
//不要调用inheritedNewInstance,而应当调用InitInstance。
//这个调用正如下面所示,因此你可以知道究竟发生了什么,
//但是请记住通常Delphi实际上并不调用InitInstance。
InitInstance(Self);
//做构造器真正要做的工作,无需用到类引用。
//注意,Delphi并不真的对构造器进行递归调用。
Self.Create(False);
Self.AfterConstruction;
except
//若有任何异常发生,Delphi自动调用对象的析构器。
Self.Destroy;
end
else
Self.Create(False);
Result:=Self;
end;
//构造器中被隐藏的代码类似于这样:
procedureTSomething.Destroy(Deallocate:Boolean);
begin
ifDeallocatethen
Self.BeforeDestruction;
//Delphi并不真的递归调用析构器,但这里是析构器真正发生作用的地方。
Self.Destroy(False);
ifDeallocatethen
begin
//Delphi并不真的调用CleanupInstance而是调用FreeInstance来做清理的工作。
//假如覆盖了FreeInstance,不要调用inheritedFreeInstance,而应当调用CleanupInstance
//来清理字串、动态数组以及可变类型字段。
Self.CleanupInstance;
//调用FreeInstance来释放对象占用的内存。
Self.FreeInstance;
end;
end;
AccessLevels访问级别
类似于C++和Java,私有的方法,只能被该类自己的方法以及在同一单元的实现部分中定义的方法、过程和函数访问。
受保护的方法,可以被该类以及派生类的任何方法访问。派生的类可以处于不同的单元中。public公用的
公开的方法没有访问限制。任何方法,函数,或者过程都可以访问公用声明的部分。除非使用$M+编译指示符,否则缺省的访问级别是公用的。published发布的
发布的声明与公用的声明基本上相同,唯一的不同是
自动的声明与公开的声明很接近,唯一的不同就是
HidingaConstructor隐藏构造器
有时,一个类不用做公用的用途,而只是作为其他类的一个辅助类。这种情况下,你可能希望该辅助类的Create是私有的或者是受保护的,但这需要技巧。TObject声明了一个公开的构造器:Create.因此即使该辅助类的构造器是私有的或者受保护的,你依然可以调用自TObject继承而来的Create构造器。尽管你不能改变继承来的Create构造器的访问权限,你还是可以通过另外一个公开的构造器来隐藏它。因为假如派生的构造器被调用,将引发一个异常。如下例:type
TPublic=class;
TPrIVateHelper=class
prIVate
//TPublic是唯一一个被允许调用真正的构造器的类
constructorCreate(Owner:TPublic);
overload;
public
//隐藏TObject.Create防止有人意外调用以试图创建TPrIVateHelper的实例
constructorCreate;
reintroduce;overload;
end;
TPublic=class
prIVate
fHelper:TPrIVateHelper;
public
constructorCreate;
destructorDestroy;
end;
constructorTPrIVateHelper.Create;
begin
raiseException.Create('Programmingerror')
end;
constructorTPublic.Create;
begin
//这是唯一一个TPrIVateHelper能被创建的地方
fHelper:=TPrIVateHelper.Create(Self);
end;
Properties属性
属性看起来更象是字段,但可以起到与方法一样的作用。属性替代了读取者和设置者(有时也称为getter和setter),但更加机动和强大。属性对于TRectEx=class(TPersistent)
prIVate
R:TRect;
functionGetHeight:Integer;
functionGetWidth:Integer;
procedureSetHeight(constValue:Integer);
procedureSetWidth(constValue:Integer);
public
constructorCreate(constR:TRect);overload;
constructorCreate(Left,Top,Right,Bottom:Integer);overload;
constructorCreate(constTopLeft,BottomRight:TPoint);overload;
procedureAssign(Source:TPersistent);override;
procedureInflate(X,Y:Integer);
procedureIntersect(constR:TRectEx);
functionIsEmpty:Boolean;
functionIsEqual(constR:TRectEx):Boolean;
procedureOffset(X,Y:Integer);
procedureUnion(constR:TRectEx);
propertyTopLeft:TPointreadR.TopLeftwriteR.TopLeft;
propertyBottomRight:TPointreadR.BottomRightwriteR.BottomRight;
propertyRect:TRectreadRwriteR;
propertyHeight:IntegerreadGetHeightwriteSetHeight;
propertyWidth:IntegerreadGetWidthwriteSetWidth;
published
propertyLeft:IntegerreadR.LeftwriteR.Leftdefault0;
propertyRight:IntegerreadR.RightwriteR.Rightdefault0;
propertyTop:IntegerreadR.TopwriteR.Topdefault0;
propertyBottom:IntegerreadR.BottomwriteR.Bottomdefault0;
end;
Arrayproperties数组型属性
数组型属性总是与数量有关,并且带有数组的特性。数组型属性不能被发布,但有许多其他用途。数组的索引可以是任何类型的,并且你可以使用多维的数组。对于数组型属性而言,你必须使用读者和写者的方法,因为你没有办法将一个数组型的属性直接映射到一个数组型的字段上。可以将其中的一个数组型属性指定为默认的。则你可以直接使用对象引用以及一个数组标号来访问该项属性而无需指明属性名称,如例子2-10所示。例2-10:使用缺省的数组属性type
TExample=class
...
propertyItems[I:Integer]:IntegerreadGetItemwriteSetItem;
propertyChars[C:Char]:CharreadGetCharwriteSetChar;default;
end;
var
Example:TExample;
I:Integer;
C:Char;
begin
Example:=TExample.Create;
I:=Example.Items[4];//必须显式的指明属性名称
C:=Example['X'];//该数组型属性时缺省的
C:=Example.Chars['X'];//效果如前
相关文章推荐
- Delphi对象模型(Part IV)
- Delphi对象模型(Part III)
- Delphi 对象模型学习笔记
- Delphi对象模型(Part II)
- Delphi对象模型(Part VI)
- Delphi对象模型(Part I)
- Delphi对象模型(Part V)
- Delphi 对象模型学习笔记
- Delphi对象模型(Part VI)
- Delphi对象模型(Part I)
- Delphi 对象模型学习笔记
- ActiveX控件访问所在网页的DHTML文档对象模型(MFC)
- 谈谈js中DOM,即文档对象模型
- BOM(浏览器对象模型)对象总结
- Html文档流和文档对象模型DOM理解
- c++对象模型之菱形继承
- C++对象模型
- delphi 对象序列化保存到文件中
- C++对象模型——执行期类型识别(第七章)
- WSS3SDK之:通过对象模型添加链接