【发布时间】:2012-02-24 03:22:02
【问题描述】:
我在Why You Should Be Using Interfaces 上感兴趣地阅读了 Nick Hodges 的博客 由于我已经爱上了编码中更高级别的接口,因此我决定研究如何将其扩展到相当低的级别,并研究 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 作为接口进行编写,这似乎是一个很好的简化——它将摆脱 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;
虽然我看不到定义的 IStrings - 当然不是在 Classes.pas 中,尽管在线 OLE 编程中有对它的引用。它存在吗?这是有效的简化吗?我正在使用 Delphi XE2。
【问题讨论】:
-
如果你想要我的意见:不要那样做!就像从不使用接口不是解决方案一样,对所有事情都使用接口也不是一个解决方案。甚至 Nick 在他的最新博文中也特别声称 TStrings/TStringList 可以完美地用作类实例。
-
TStrings 几乎是一个接口,它是一个抽象类,可以有不同的实现。只要有可能,我只传递 TStrings 作为参数的类型,而不是 TStringList。
-
我同意@UweRaabe。接口很强大,而强大的工具经常被新手滥用。不要仅仅因为这是可能的,就使用接口引用而不是对象引用。我建议坚持接口的初衷——开放可扩展设计。
-
开发人员是时髦的生物,不是吗。
-
它会生成一个警告,不是吗,@Mjn?它是一个抽象类,或者至少它曾经是。 Delphi 仅在实例化抽象类时警告,而在大多数其他语言中它是一个错误。
标签: delphi interface delphi-xe2 tstringlist