当前位置:主页>仓库管理软件> 列表

如何遍历 一个类的所有子类(在一个单元中) ,分不够还有

财务软件版1楼: 这个问题有点变态,但是我确实要用啊

2楼: 把你的要求描述的具体点或许能帮上你,你说的太笼统了。 如excel进销存

3楼: 我在一个单元中声明了一个类TA
和一堆TA的子类TB、TC等
我想要一个方法遍历这个单元中TA 的所有子类

4楼: 你的意思是:
如果这个TA的子类:TA1、TA2创建了do something,不创建do others?
是吗?

5楼: 直接枚举很难,子类可以得到父类的信息,但父类是不知道它有没有子类和子类的信息的,RTTI中类的信息的确有类所在单元名称,但好象还没有获得某个单元所有类信息的函数或方法。
我觉得,既然是你自己写的单元,那么不妨自己维护一个该单元类继承结构的树状列表,如:
var
ClassesList: TStringList;

function GetClassChilds(const ClassName: string; List: TStrings): TStrings;
var
I: Integer;
begin
I := List.IndexOf(ClassName);
if I >= 0 then
begin
Result := TStrings(List.Objects[I]);
Exit;
end;
for I := 0 to List.Count - 1 do
begin
Result := GetClassChilds(ClassName, TStrings(List.Objects[I]));
if Result <> nil then Exit;
end;
Result := nil;
end;

procedure FreeClassesList(List: TStrings);
var
I: Integer;
begin
for I := 0 to List.Count - 1 do
FreeClassesList(TStrings(List.Objects[I]));
List.Free;
end;

initialization
ClassesList := TStringList.Create;
ClassesList.Sorted := True;
ClassesList.AddObject(''TA'', TStringList.Create);
with TStringList(ClassesList[0]) do
begin
Sorted := True;
AddObject(''TB'', TStringList.Create);
AddObject(''TC'', TStringList.Create);
end;
finalization
FreeClassesList(ClassesList);
end.
代码随手写的,没有测试过,你自己试一下看看。

6楼: 我的意思是
已知TA
通过某种方法找到TB,TC等,并调用它们,但程序执行时并不知道有多少子类

财务软件版7楼: TA和TB,TC有什么关系吗?

8楼: “已知TA
通过某种方法找到TB,TC等,并调用它们,但程序执行时并不知道有多少子类”
子类是你在设计时自己定义好了的,为什么说程序执行时并不知道有多少子类呢?
说说程序运行时类的信息表示:编译时Delphi的架构已经为每一个类创建了类的信息,表
现为类表,即创建好了代表类信息的VMT表,根据继承关系,子类的信息表中有指向父类
信息表的指针(为实现子类对象调用到父类的一些方法),所以可以通过子类获得父类的信息
而父类表中并不存在指向子类表的指针,也就不可能向下获取信息。所以,仅知道一父类,
并不能通过它获知有多少、有哪些子类,遍历只能是从底往上遍历的。
所以,要从父类遍历到子类,除非你从父类就开始设计管理子类的机制或者直接操作内
存(即通过指针偏移获得子类表信息),而没有一般方法可以直接从父类向下遍历子类。作为
方法,我觉得lichengbin的方法可以,创建一个维护该单元类继承结构的树状列表。另外,
可以参考参考Delphi VCl里的TComponent类及其派生类的设计,其中用到了TList管理子
组件,但这是在类对象创建的时候进行的(往TList中添加子类对象以统一管理,如父组件
销毁时统一销毁子组件)。
>>个人想法,供参考<<

9楼: 多人接受答案了。