關於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及之後版本

相關文章
相關標籤/搜索