delphi - 在 (Win32) Delphi 中模拟类属性

标签 delphi delphi-xe2 static-methods

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}

最佳答案

这里需要指定一些事情:

首先,由于您已将其标记为 XE2,因此它支持 Class Properties正确地,与 Class Field Variables 。自(我认为)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 建议的可写常量。在所有情况下,您的主要问题是多线程访问。

关于delphi - 在 (Win32) Delphi 中模拟类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16320306/

相关文章:

delphi - 将 SAPI 文本转语音本地化为西类牙语

delphi - 用 PChar 操作替换字符串赋值

python - 如何使用静态方法作为策略设计模式的默认参数?

javascript - 我什么时候想在 JavaScript 中使用 “class”(静态)方法或属性?

macos - 如何允许 Delphi XE2 从运行 Windows 7 的 VirtualBox VM 中查看 Mac 上的共享文件夹

delphi - 在长循环中处理消息时如何最大限度地减少开销

delphi - XE2 版本信息不起作用

delphi - 如何从 64 位代码调用 32 位 DLL?

delphi-xe2 - 如何在 FireMonkey 中创建闪屏?

python - Python 中的静态方法和实例方法