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

  • 主题发起人 主题发起人 sunjialong
  • 开始时间 开始时间
S

sunjialong

Unregistered / Unconfirmed
GUEST, unregistred user!
这个问题有点变态,但是我确实要用啊
 
这个问题有点变态,但是我确实要用啊
 
把你的要求描述的具体点或许能帮上你,你说的太笼统了。
 
我在一个单元中声明了一个类TA
和一堆TA的子类TB、TC等
我想要一个方法遍历这个单元中TA 的所有子类
 
你的意思是:
如果这个TA的子类:TA1、TA2创建了do something,不创建do others?
是吗?
 
直接枚举很难,子类可以得到父类的信息,但父类是不知道它有没有子类和子类的信息的,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);
Exit;
end;
for I := 0 to List.Count - 1 do
begin
Result := GetClassChilds(ClassName, TStrings(List.Objects));
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));
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.
代码随手写的,没有测试过,你自己试一下看看。
 
我的意思是
已知TA
通过某种方法找到TB,TC等,并调用它们,但程序执行时并不知道有多少子类
 
TA和TB,TC有什么关系吗?
 
“已知TA
通过某种方法找到TB,TC等,并调用它们,但程序执行时并不知道有多少子类”
子类是你在设计时自己定义好了的,为什么说程序执行时并不知道有多少子类呢?
说说程序运行时类的信息表示:编译时Delphi的架构已经为每一个类创建了类的信息,表
现为类表,即创建好了代表类信息的VMT表,根据继承关系,子类的信息表中有指向父类
信息表的指针(为实现子类对象调用到父类的一些方法),所以可以通过子类获得父类的信息
而父类表中并不存在指向子类表的指针,也就不可能向下获取信息。所以,仅知道一父类,
并不能通过它获知有多少、有哪些子类,遍历只能是从底往上遍历的。
所以,要从父类遍历到子类,除非你从父类就开始设计管理子类的机制或者直接操作内
存(即通过指针偏移获得子类表信息),而没有一般方法可以直接从父类向下遍历子类。作为
方法,我觉得lichengbin的方法可以,创建一个维护该单元类继承结构的树状列表。另外,
可以参考参考Delphi VCl里的TComponent类及其派生类的设计,其中用到了TList管理子
组件,但这是在类对象创建的时候进行的(往TList中添加子类对象以统一管理,如父组件
销毁时统一销毁子组件)。
>>个人想法,供参考<<
 
多人接受答案了。
 
后退
顶部