我正在编写一个应用程序,该应用程序映射出一个目录结构,该目录结构需要尽可能多地保存有关每个文件的信息,以便最终用户可以应用自定义过滤器来操作其中的文件和文件夹。还进行文件搜索的类将基本信息返回给 UI,让最终用户了解所涉及的数据量。我想要完成的是通过属性递归到类的子对象以获取我需要的信息,这样我只需要访问顶级类来获取所需的信息而不必担心信息在任意数量的子类中。
type
TSomeClass = class(TObject)
private
FContainerForSubObjects: TObjectList<TSomeClass>;
FSomethingToBeCounted: Integer;
FHasTheDataChanged: Boolean;
private
function GetSomethingToBeCounted: Integer;
function GetHasTheDataChanged: Boolean;
public
property SomethingToBeCounted: Integer read GetSomethingToBeCounted;
property HasTheDataChanged: Boolean read GetHasTheDataChanged;
使类声明更有意义。像这样看。包含一个文件夹,ContainerForSubObjects
因此如果您要查看硬盘驱动器,根类将是 C:\ 如果有一个名为 data 的文件夹,则会有一个代表 C:\Data 文件夹的子对象,并且SomethingToBeCounted
将是每个文件夹中的文件。
现在我想在GetSomethingToBeCounted
函数中做什么,如果如下
- 查看是否有任何子对象(这很容易)
- 如果有子对象,则查询它们的
SomethingToBeCounted
属性,该属性又应调用GetSomethingToBeCounted
函数以返回FSomethingToBeCounted
类字段的值,但该函数应根据HasTheDataChanged
类的状态条件进行操作这是我希望递归的地方起作用- 如果
HasTheDataChanged
任何包含的子对象的属性设置为 false 是最新的,那么它应该返回它的值并且不应该进行更多处理 - 如果
HasTheDataChanged
属性设置为 true 数据不是最新的,应该重新计算并返回新的重新计算值。它还应该设置适当的HasTheDataChanged
状态,以减少进一步的重新处理。
- 如果
我还假设这种类似类型的传播也必须使用 HasTheDataChanged 属性来完成,这样如果树中间某处的值发生变化,所有父对象都会相应地更新。
希望这些要求有意义
现在到问题的实质。首先。我的想法是否正确,仅通过访问子对象属性,正确的值就会传播到根对象,因此当可能有数千个子对象时,我不必花费无数行代码搜索每个子对象。还是我试图在这里重新发明轮子,而我只是在寻找一个已经存在并且可以使用而不是自己制作的类。最后但并非最不重要。这会是最有效的做事方式吗?