[英]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.