首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在终结中使用私有方法/var

在终结中使用私有方法/var
EN

Stack Overflow用户
提问于 2015-10-23 10:38:32
回答 1查看 141关注 0票数 2

我有(静态)类GT_MyClass

代码语言:javascript
复制
GT_MyClass = class
private
  class var FImage : TJpegImage;

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

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

代码语言:javascript
复制
class function GT_Myclass.GetImage: TJpegImage;
begin
    if not Assigned(FImage) then
    begin
      FImage := TJpegImage.Create;
    end;
    Result := FImage;
end;

在最后定稿时,我想要FreeAndNil(FImage)

代码语言:javascript
复制
finalization
  if Assigned(FImage) then
    FreeAndNil(FImage);

但是在终结块中,我看不到私有var FImage..。

你能帮帮我吗?

谢谢!

顺便说一句:我想要属性图像是绝对静态的

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-23 10:40:07

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

代码语言:javascript
复制
finalization
  if Assigned(GT_MyClass.FImage) then
    FreeAndNil(GT_MyClass.FImage);

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

代码语言:javascript
复制
finalization
  FreeAndNil(GT_MyClass.FImage);

或者您可以提供类的另一种方法,它更好地封装了以下内容:

代码语言:javascript
复制
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;

但是,这仍然让您从类外部调用一个私有方法,这并不理想。因此您可以使用一个class destructor,它是从单元的终结代码中执行的:

代码语言:javascript
复制
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;

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33300350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档