delphi - 在终结中使用私有(private)方法/var

标签 delphi properties static delphi-xe6 finalize

我有(静态)GT_MyClass 类

GT_MyClass = class
private
  class var FImage : TJpegImage;

  class function GetImage: TJpegImage;
public
  property Image : TJpegImage  read GetImage;
end;

在函数 GetImage 中,如果 FImage 尚不存在,我将创建它。

class function GT_Myclass.GetImage: TJpegImage;
begin
    if not Assigned(FImage) then
    begin
      FImage := TJpegImage.Create;
    end;
    Result := FImage;
end;

在最终确定中我想要 FreeAndNil(FImage)

finalization
  if Assigned(FImage) then
    FreeAndNil(FImage);

但在终结 block 中我看不到私有(private)变量 FImage...

请问你能帮我吗?

谢谢!

顺便说一句:我希望属性图像绝对静态

最佳答案

这是由于范围的差异造成的。在类方法 GT_MyClass.GetImage 中,您的代码位于类的范围内,因此可以看到类成员。终结部分在全局范围内执行。因此,您可以通过限定名称来编译代码:

finalization
  if Assigned(GT_MyClass.FImage) then
    FreeAndNil(GT_MyClass.FImage);

事实上,测试分配的 GT_MyClass.FImage 是没有意义的,因为 Free 已经这样做了。所以你会写:

finalization
  FreeAndNil(GT_MyClass.FImage);

或者您可以提供该类的另一种方法来更好地封装它:

type
  GT_MyClass = class
  private
    class var FImage : TJpegImage;
    class function GetImage: TJpegImage;
    class procedure Finalize;
  public
    property Image : TJpegImage  read GetImage;
  end;
....
class procedure GT_MyClass.Finalize;
begin
  FreeAndNil(FImage); // in scope of class, no need to qualify
end;
....
finalization
  GT_MyClass.Finalize;

但这仍然让您从类外部调用私有(private)方法,这并不理想。所以你可以使用 class destructor ,它是从单元的最终代码执行的:

type
  GT_MyClass = class
  private
    class var FImage : TJpegImage;
    class function GetImage: TJpegImage;
    class destructor ClassDestroy;
  public
    property Image : TJpegImage  read GetImage;
  end;
....
class destructor GT_MyClass.ClassDestroy;
begin
  FreeAndNil(FImage); // in scope of class, no need to qualify
end;

不需要终结代码,编译器会自动确保调用类析构函数。

关于delphi - 在终结中使用私有(private)方法/var,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33300350/

相关文章:

c# - 静态到实例,我该如何正确处理?

windows - 在 Windows 8 中调试 Win64 应用程序时出现 "Unable to create process ...\project1.exe"

delphi - 从服务运行应用程序,CreateProcessAsUser 失败

delphi - 在哪里可以找到有关在 Delphi 2007 或更高版本中使用 DUnit 的介绍?

java - 我可以在多个 jvm 上访问修改后的属性吗?

java - 如何获取列表列表中的某个元素?

delphi - 菜单驱动程序中的全局可访问数据存储?

delphi - 将setter添加到后代类的属性中

java - 如何在 Java 中加载嵌套类?

php - 在 PHP 中从具有动态类名的类中获取静态属性