关于C++类静态成员在Delphi中实现的思考
没有用过Version 7 以后的Delphi版本,即便5、6、7版本,我也不能够说了解较深。因此,本文可能杞人忧天。
一、为什么需要静态成员
比如:一个类,常常需要创建多个对象,我们经常需要得到这些对象的Count;再如:在类似链表中,我们需要标识它的头部。这些信息,都需要供给所有对 象共享(甚至类)。不可能把信息放到类中去,因为类不占有内存空间;不能够用全局变量,这将破坏类的封装;如果放到对象中去,又显然不现实:当某一个对象 发生改变时,要逐一对同类的其他对象进行修改,这不现实。
二、C++如何实现静态成员
C++中,用static关键字声明成员为静态成员,并在类的外部给该成员赋初值。由于成员被声明为protected的,所以,保证了封装的安全性。在此不举例说明了。
三、Delphi模拟实现C++的类静态成员
我不认为Delphi的OWner管理机制是解决这个问题的良好途径(当然,OWner并不是专门为了解决这个的)至少,它不直观,责任不明确。下面的 代码,在TForm2类定义的单元的实现部分,声明一个全局变量(注意,在实现部分声明,与在接口部分声明,是完全不同的;又加上这个单元仅仅定义 TForm2这个类,可以保证该全局变量的安全),以及一个类方法,专供处理这个全局变量。
//************ 以下是定义TForm2类的单元Unit2 *********
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm2 = class(TForm)
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
class function GetCount: integer;
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
var
Count : integer = 0; //这就是“静态成员”,其封装的安全性基本可以保证;初值默认本来就是0
constructor TForm2.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Inc(Count); //每构造一个TForm2类的对象,“静态成员”自增1
end;
destructor TForm2.Destroy;
begin
Dec(Count); //每析构一个TForm2类的对象,“静态成员”自减1
inherited Destroy;
end;
class function TForm2.GetCount: integer;
begin
result := Count; //通过类方法GetCount,可以得到“静态成员”值,哪怕没有创建任何对象
end;
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
//因为是用了Form类,为了测试析构后“静态成员”的变化,就用了这里的代码做一下辅助
begin
Action := caFree;
end;
end.
//************ 以下是程序主Form的单元 ************
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
with TForm2.Create(self) do Show; //每点击一次Button1,即创建一个TForm2的对象
end;
procedure TForm1.Button2Click(Sender: TObject);
var
Cnt : integer;
begin
Cnt := TForm2.GetCount; //随时可以观察现存TForm2类对象的个数
Caption := Format(‘目前存在TForm2类对象 %d 个‘, [Cnt]);
end;
end.
//据说,Delphi2005及以后版本,支持“静态成员”。不过我没用过Delphi2005及以后版本