没有用过Version 7 之后的Delphi版本,即使五、六、7版本,我也不可以说了解较深。所以,本文可能杞人忧天。
1、为何须要静态成员
好比:一个类,经常须要建立多个对象,咱们常常须要获得这些对象的Count;再如:在相似链表中,咱们须要标识它的头部。这些信息,都须要供给全部对 象共享(甚至类)。不可能把信息放到类中去,由于类不占有内存空间;不可以用全局变量,这将破坏类的封装;若是放到对象中去,又显然不现实:当某一个对象 发生改变时,要逐一对同类的其余对象进行修改,这不现实。
2、C++如何实现静态成员
C++中,用static关键字声明成员为静态成员,并在类的外部给该成员赋初值。因为成员被声明为protected的,因此,保证了封装的安全性。在此不举例说明了。
3、Delphi模拟实现C++的类静态成员
我不认为Delphi的OWner管理机制是解决这个问题的良好途径(固然,OWner并非专门为了解决这个的)至少,它不直观,责任不明确。下面的 代码,在TForm2类定义的单元的实现部分,声明一个全局变量(注意,在实现部分声明,与在接口部分声明,是彻底不一样的;又加上这个单元仅仅定义 TForm2这个类,能够保证该全局变量的安全),以及一个类方法,专供处理这个全局变量。安全
//************ 如下是定义TForm2类的单元Unit2 *********ide
unit Unit2;测试
interfacespa
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;orm
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}it
var
Count : integer = 0; //这就是“静态成员”,其封装的安全性基本能够保证;初值默认原本就是0io
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及之后版本