关于C++类静态成员在Delphi中实现的思考

关于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及以后版本


转载于:https://my.oschina.net/u/566587/blog/342959

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值