我们如何激活(按需)一个对象是另一个对象的属性?

Ple*_*rds 2 delphi oop file-io

我正在实现一个对象TTextFile,它是一个使用低级pascal文件函数和OO范例的框架.我想向开发人员添加在同一对象中需要时将其用作TStringList的选项,如下所示:

 TTextFile = class(TObject)
   constructor Create(FileName: String);
   procedure OpenForRead;
   procedure OpenForWrite;
   {...}
   property Content: TStringList;
 end;
Run Code Online (Sandbox Code Playgroud)

但我的问题是我希望该Content属性LoadFromFile仅在应用程序第一次使用它时才使用用户.不在Create构造中,因为文件可能太大,程序员更喜欢在这种情况下使用其他函数.在Content将使用的时候,他知道他是用不会非常大的文件.

大文件的示例是包含所有客户端名称和公民ID的列表.一个非常小的文件的例子是相同的列表,但仅限于当天等待参加的客户端.

是否可以在OO pascal中完成?如果不可能,我将不得不进行一种激活程序或过载Create,并使程序员Content在使用之前始终检查是否已加载.

Rob*_*edy 7

使用延迟初始化的概念.第一次Content读取属性时,加载文件内容,但随后保持内容可用,以便后续访问属性不会重新读取文件.

private
  FContent: TStrings;
  function GetContent: TStrings;
public
  property Content: TStrings read GetContent;

function TTextFile.GetContent: TStrings;
begin
  if not Assigned(FContent) then begin
    FContent := TStringList.Create;
    try
      FContent.LoadFromFile(FFileName);
    except
      FContent.Free;
      FContent := nil;
      raise;
    end;
  end;
  Result := FContent;
end;
Run Code Online (Sandbox Code Playgroud)