2

Simulating class properties in (Win32) Delphi中,有定义“类属性”和类方法的技巧:

unit myObjectUnit;

interface

type
  TMyObject = Class
  private
    class function GetClassInt: integer;
    class procedure SetClassInt(const Value: integer);
  public
    property ClassInt : integer read GetClassInt 
                                write SetClassInt;
  end;

implementation

{$WRITEABLECONST ON}
const TMyObject_ClassInt : integer = 0;
{$WRITEABLECONST OFF}

class function TMyObject.GetClassInt: integer;
begin
  result := TMyObject_ClassInt;
end;

class procedure TMyObject.SetClassInt(
  const Value: integer);
begin
  TMyObject_ClassInt := value;
end;

end.

我的代码中只有一个这样的对象,因此 GetClassInt 和 SetClassInt 始终在同一个类型的常量 *TMyObject_ClassInt* 上运行的警告不适用:

procedure TForm1.Button1Click(Sender: TObject);
var
  myObject : TMyObject;
begin
  myObject.ClassInt := 2005;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  myObject : TMyObject;
begin
  ShowMessage(IntToStr(myObject.ClassInt));
end;

(这说明了警告:单击 1,然后单击 2,消息显示 2005,而不是 0)。

尽管如此,这段代码还是有点腥。我可以期待问题(除了上面的警告)吗?有没有更好的办法?.

顺便说一句,我不是在谈论暴力 $WRITEABLECONST OFF - 而不是返回到以前的状态。可以通过以下方式规避:

{$IFOPT J-}
{$DEFINE WC_WAS_OFF}
{$ENDIF}
{$WRITEABLECONST ON}
const TMyObject_ClassInt : integer = 0;
{$IFDEF WC_WAS_OFF}
{$WRITEABLECONST OFF}
{$ENDIF}
4

3 回答 3

3

这里有几件事需要说明:

首先,由于您已将其标记为 XE2,因此它通过Class Field Variables正确支持Class Properties。自(我认为)Delphi 2009 以来就是这种情况。

type
  TMyClass = class
    strict private
      class var         // Note fields must be declared as class fields
        FRed: Integer;
        FGreen: Integer;
        FBlue: Integer;
      public             // ends the class var block
        class property Red: Integer read FRed write FRed;
        class property Green: Integer read FGreen write FGreen;
        class property Blue: Integer read FBlue write FBlue;
  end;

可以访问为:

TMyClass.Red := 0;
TMyClass.Blue := 0;
TMyClass.Green := 0;

对于旧版本的 Delphi,这种解决方法是有效的,尽管我会使用单位变量而不是 Uli 建议的可写常量。在所有情况下,您的主要问题都是多线程访问。

于 2013-05-01T15:07:05.847 回答
1

现在支持类字段有一段时间了(我认为至少从 Delphi 2009 开始),你声明它们就像

type
  TMyObject = Class
  public
    class var ClassInt : integer;
  end;

请参阅帮助中的类字段主题。

于 2013-05-01T15:05:00.497 回答
0

此声明自 Delphi-2009 起有效:

type
  TMyObject = Class
  strict private
    class var
       MyClassInt : integer;
  private
    class function GetClassInt: integer; static;
    class procedure SetClassInt(const Value: integer); static;
  public
    class property ClassInt : integer read GetClassInt
                                write SetClassInt;
  end;

使您的类方法静态并将您的属性声明为class property.

于 2013-05-01T15:17:13.140 回答