0

Delphiを使用しています。私はルートクラスとルートからの多くの派生クラスを持っています、クラスの名前はTROOT、TA、TB、TCと言います...コードには、次のコードによってプログラムのフローを制御するためのコードがあります

var
  obj :TROOT;
begin
  if ((obj is TA) or (obj is TB) or (obj is TC) or (obj is TD)) then
  begin
    // some other codes here
  end
end;

このコードはうまく機能しますが、コードを拡張して、TROOTからより多くのサブクラスが派生し、そのswtichがプログラムの複数の場所に表示されるようにします。クラスタイプをセットまたは配列に入れて、次のような疑似コードを作成して、コードが拡張されたときにどこでも変更する必要がないようにする方法はありますか?

classarray = {TA, TB, TC, TD, TE, TF};
if (obj in classarray) then
begin
  // put my code here
end

ありがとう。

4

4 に答える 4

5

もちろん、クラスを配列に入れることもできます。次のようにタイプを宣言します。

type
  TRootClass = class of TRoot;
  TRootClassArray = array of TRootClass;

配列を宣言してデータを入力します。

var
  RootClasses: TRootClassArray;

SetLength(Classes, 4);
RootClasses[0] := TA;
RootClasses[1] := TB;
RootClasses[2] := TC;
RootClasses[3] := TD;

次に、配列の内容をテストできます。

var
  c: TRootClass;

for c in RootClasses do
  if obj is c then
    // ...
于 2012-11-18T01:40:53.110 に答える
3

これを処理する方法は、ますます優れており、OOPのようなものがあります。

または非常に単純なアプローチとして(ただし制限もあります)

TROOT = class
...
end;

// just an dummy class to identify
TROOTALLOWED = class(TROOT)
end;

TA = class( TROOTALLOWED )
end;

TB = class( TROOT )
end;

TC = class( TROOTALLOWED )
end;

とコードで

if obj is TROOTALLOWED then
于 2012-11-18T01:49:04.027 に答える
1

スーパークラスで抽象関数を宣言し、継承されたクラスで関数をオーバーライドします。

TROOT = class
  function HasFeature1:Boolean;virtual;abstract;
end;


// just an dummy class to identify
TA= class(TROOT)
  function HasFeature1:Boolean;override;

end;

 if obj.HasFeature1 then // obj:TRoot
 begin
   // do something
 end;
于 2012-11-18T09:21:43.887 に答える
0

ここでは多くの人が「真新しい自転車」を招き、アドホックなアレイなどを作っているようです。古典的な「NIH症候群」のように見えます。

ただし、VCLがどのように実装され、そのRegisterClassルーチンがどのように機能するかを考えることができます。少し猫のような好奇心は、プログラマーの職業上の要件であるはずです;-)

前述のルーチンを少し調べると、Delphiの非常に典型的なもの(既製のTListコンテナ)がわかります。

http://docwiki.embarcadero.com/Libraries/XE3/en/System.Contnrs.TClassList

だから、そのコード

classarray = {TA, TB, TC, TD, TE, TF};
if (obj in classarray) then
begin
  // put my code here
end

次のようなものに変換されます

var classarray : TClassList; ci: TClass;
...
classarray := TClassList.Create;
for ci in (TA, TB, TC, TD, TE, TF) do classarray.Add(ci);
....

if classarray.IndexOf(obj.Class) >= 0  then
begin
  // put my code here
end
....

classarray.Free;
于 2012-11-19T11:34:59.550 に答える