繁体   English   中英

如何在Delphi中创建用于比较的类名数组?

[英]How can I create array of classname for comparision in Delphi?

我正在使用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

谢谢。

您当然可以将类放入数组中。 声明如下类型:

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
    // ...

有更多甚至更好的和类似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

在超类上声明一个抽象函数,并在继承的类上重写该函数。

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;

我看到很多人都在这里邀请“崭新的自行车”,制作临时阵列等等。 看起来像经典的“ 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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM