沒有用過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及之後版本