gpt4 book ai didi

delphi - 针对带有 TStrings 和 TStringList 的接口(interface)进行编码

转载 作者:行者123 更新时间:2023-12-03 14:52:15 34 4
gpt4 key购买 nike

我饶有兴趣地阅读了 Nick Hodges 的博客 Why You Should Be Using Interfaces由于我已经爱上了编码中更高级别的接口(interface),因此我决定研究如何将其扩展到相当低的级别,并调查 VCL 类中对此存在哪些支持。

我需要的一个常见构造是使用 TStringList 做一些简单的事情,例如此代码将小文本文件列表加载到逗号文本字符串中:

var
MyList : TStrings;
sCommaText : string;
begin
MyList := TStringList.Create;
try
MyList.LoadFromFile( 'c:\temp\somefile.txt' );
sCommaText := MyList.CommaText;

// ... do something with sCommaText.....

finally
MyList.Free;
end;
end;

如果我可以使用 MyList 作为接口(interface)进行编写,这似乎是一个很好的简化 - 它将摆脱 try-finally 并提高可读性:

var
MyList : IStrings;
//^^^^^^^
sCommaText : string;
begin
MyList := TStringList.Create;
MyList.LoadFromFile( 'c:\temp\somefile.txt' );
sCommaText := MyList.CommaText;

// ... do something with sCommaText.....

end;

尽管有与在线 OLE 编程相关的引用,但我看不到 IString 的定义 - 当然不在 Classes.pas 中。它存在吗?这是有效的简化吗?我正在使用 Delphi XE2。

最佳答案

RTL/VCL 中没有接口(interface)可以执行您想要的操作(公开与 TStrings 相同的接口(interface))。如果你想使用这样的东西,你需要自己发明它。

您可以使用如下包装器来实现它:

type
IStrings = interface
function Add(const S: string): Integer;
end;

TIStrings = class(TInterfacedObject, IStrings)
private
FStrings: TStrings;
public
constructor Create(Strings: TStrings);
destructor Destroy; override;
function Add(const S: string): Integer;
end;

constructor TIStrings.Create(Strings: TStrings);
begin
inherited Create;
FStrings := Strings;
end;

destructor TIStrings.Destroy;
begin
FStrings.Free; // don't use FreeAndNil because Nick might see this code ;-)
inherited;
end;

function TIStrings.Add(const S: string): Integer;
begin
Result := FStrings.Add(S);
end;

自然地,您会将 TStrings 接口(interface)的其余部分包装在一个真正的类中。使用这样的包装类来执行此操作,以便您只需访问它的实例即可包装任何类型的 TStrings

像这样使用它:

var
MyList : IStrings;
....
MyList := TIStrings.Create(TStringList.Create);

您可能更愿意添加一个辅助函数来实际执行调用 TIStrings.Create 的肮脏工作。

另请注意,生命周期可能是一个问题。您可能需要此包装器的变体,该变体不会接管底层 TStrings 实例的生命周期管理。这可以通过 TIStrings 构造函数参数进行安排。

<小时/>

就我个人而言,我认为这是一个有趣的思想实验,但并不是一个真正明智的方法。 TStrings 类是一个抽象类,它几乎具有接口(interface)提供的所有优点。我认为按原样使用它没有真正的缺点。

关于delphi - 针对带有 TStrings 和 TStringList 的接口(interface)进行编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9095944/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com