0

我正在使用德尔福。我有一个根类和许多来自根的派生类,类的名称是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

declare a abstract function on superclass and override the function on inherited classes.

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 回答