您的位置:首页 > 编程语言 > Delphi

[转]理解 Delphi 的类(十一) - 深入类中的方法[10] - 构造方法与析构方法

2013-01-16 14:17 507 查看
//构造方法就是对象建立时调用的方法; 析构方法就是对象销毁时调用的方法. 如:

TMyClass = class(TObject)
public
constructor Create;           {构造方法}
destructor Destroy; override; {析构方法}
end;

{几个要点:
这两个方法都可以追溯到所有类的祖先类 TObject;
它们都属于类方法, 尽管没有 class 标识符;
但和类方法也有区别: 一般的类方法不能使用类中非静态数据; 但它们可以.

必须使用 constructor 和 destructor 来定义, 但名称未必是: Create 与 Destroy;
如果不使用 Create 与 Destroy 的命名会带来很多麻烦, 没必要尝试.

我们自己的代码在 Create 中是执行在父类的 Create 代码之后; 在 Destroy 中执行在之前;
所以, 一般会用这样的语句格式:
}

constructor TMyClass.Create;
begin
inherited;
//...
end;

destructor TMyClass.Destroy;
begin
//...
inherited;
end;

{
Create 是我们用得最多的方法; 但 Destroy 是我们用得最少的方法;
因为通过 Free 调用 Destroy 更安全一些.

Destroy 是一个虚方法; Create 在祖先类中虽然是静态方法, 但在很多实用的类中也成了虚方法;
所以在覆盖或重载时应区别对待.
}

// Create 应该是受到编译器特别对待的一个方法, 譬如:
TMyClass = class(TObject)
public
constructor Create;
end;

{从道理上来讲, 这会隐藏或替换了父类的 Create ; 但实际上没有, 编译器肯定要做一个幕后工作!}

//再如:
TMyClass = class(TObject)
public
constructor Create(x,y: Integer);
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TMyClass }
constructor TMyClass.Create(x, y: Integer);
begin
//inherited Create;
//...
end;

{
编译器竟也允许没有 overload 的重载; 竟也允许去掉这句: inherited Create;
如果没有 TObject.Create 方法, 类如何初始化、分配内存?
所以这都是表面现象, 我想编译器会自动 overload、自动 inherited Create 的.

其他方法不会有这些特殊待遇的, 看来哪都有走后门的.
}
From 万一的 Delphi 博客
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐