42

変数がとして宣言されTStrings、作成されるのはなぜTStringListですか?

例:varslはとして宣言されていますTStringsが、として作成されていますTStringList

var
  sl : TStrings;
begin
  sl := TStringList.Create;

  // add string values...
  sl.Add( 'Delphi' );
  sl.Add( '2.01' );

  // get string value using its index
  // sl.Strings( 0 ) will return
  //   'Delphi'
  MessageDlg(
    sl.Strings[ 0 ],
    mtInformation, [mbOk], 0 );

  sl.Free;
end;
4

4 に答える 4

41

TStringsすべてのメソッドが実装されていない抽象型です。

TStringListはの子孫でTStringsあり、すべての関数を実装します。コードでは、変数をとして宣言することもできますTStringList

ただし、たとえば関数定義では、 :TStringsの代わりにパラメーターを受け入れることは理にかなっています。TStringList

procedure doSomething(lst: TStrings);

これにより、関数はTStrings、だけでなく、のすべての実装で機能できるようになりますTStringList

于 2012-02-21T14:57:26.497 に答える
33

私の考えでは、それは完全に無害ですが、かなり無意味です。あなたは完全にそうだと宣言することができslTStringList私はいつもそうするでしょう。コードの読者にとっては、ローカル変数のリストを理解しやすくします。

このコードslでは常にインスタンスが割り当てられているため、基本クラスタイプが。であるTStringListと宣言しても何も得られません。ただし、さまざまな種類の子孫を変数に割り当てるコードがある場合は、それをとして宣言するのが理にかなっています。slTStringsTStringsTStrings

変数を型であると宣言する可能性がある状況TStringsは、通常、コードがインスタンスを明示的に作成していない場合です。たとえば、文字列リストをパラメータとして受け取ったユーティリティメソッドは、それTStrings以降、任意の子孫を渡すことができる場合は、より便利です。簡単な例を次に示します。

procedure PrintToStdOut(Strings: TStrings);
var
  Item: string;
begin
  for Item in Strings do
    Writeln(Item);
end;

TStrings明らかに、これは、パラメーターがではなくであると宣言されている場合に、はるかに有用ですTStringList

slただし、問題のコードはこの性質のものではなく、型であると宣言された場合、これまでにないほど穏やかに改善されると思いますTStringList

于 2012-02-21T14:54:23.510 に答える
10

そうすればTStrings、変数に別の子孫を入れることができるからSLです(私はおそらくそれをStrings、ではなく呼び出すでしょうSL)。

あなたの場合、それは議論の余地があります。なぜなら、周りのロジックにSLはaの作成が含まれておりTStringList、外部割り当てやパラメーター解析は含まれていないからです。

ただし、ロジックを割り当てから分離した場合は、TStrings子孫を使用することでメリットが得られます。

たとえば、、、TMemoy.Linesなど。外部からはTListBox.Items、 のように見えますが、内部では、独自の子孫を使用します。TComboBox.Items
TStringsTStringList

から派生したクラスのいくつかの例TStrings

source\DUnit\Contrib\DUnitWizard\Source\DelphiExperts\Common\XP_OTAEditorUtils.pas:
     TXPEditorStrings = class(TStrings)
source\fmx\FMX.ListBox.pas:
       TListBoxStrings = class(TStrings)
source\fmx\FMX.Memo.pas:
     TMemoLines = class(TStrings)
source\rtl\common\System.Classes.pas:
     TStringList = class(TStrings)
source\vcl\Vcl.ComCtrls.pas:
     TTabStrings = class(TStrings)
     TTreeStrings = class(TStrings)
     TRichEditStrings = class(TStrings)
source\vcl\Vcl.ExtCtrls.pas:
     TPageAccess = class(TStrings)
     THeaderStrings = class(TStrings)
source\vcl\Vcl.Grids.pas:
     TStringGridStrings = class(TStrings)
     TStringSparseList = class(TStrings)
source\vcl\Vcl.Outline.pas:
     TOutlineStrings = class(TStrings)
source\vcl\Vcl.StdCtrls.pas:
     TCustomComboBoxStrings = class(TStrings)
     TMemoStrings = class(TStrings)
     TListBoxStrings = class(TStrings)
source\vcl\Vcl.TabNotBk.pas:
     TTabPageAccess = class(TStrings)
于 2012-02-21T21:23:18.297 に答える
7

TStringListは、抽象TStringsクラスの具体的な実装です。

于 2012-02-21T14:53:06.680 に答える