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

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

  没有用过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及之后版本

相关文章
相关标签/搜索