gpt4 book ai didi

delphi - 递归属性 (Delphi)

转载 作者:行者123 更新时间:2023-12-03 18:28:13 24 4
gpt4 key购买 nike

我正在编写一个应用程序,该应用程序映射出一个目录结构,该目录结构需要尽可能多地保存有关每个文件的信息,以便最终用户可以应用自定义过滤器来操作其中的文件和文件夹。还进行文件搜索的类将基本信息返回给 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 属性来完成,这样如果树中间某处的值发生变化,所有父对象都会相应地更新。

    希望这些要求有意义

    现在到问题的实质。首先。我的想法是否正确,仅通过访问子对象属性,正确的值就会传播到根对象,因此当可能有数千个子对象时,我不必花费无数行代码搜索每个子对象。还是我想在这里重新发明轮子,而我只是在寻找一个已经存在并且可以使用而不是自己制作的类。最后但并非最不重要。这会是最有效的做事方式吗?

    最佳答案

    我还没有遇到过可以执行您想要的操作的现有组件,因此编写自己的组件似乎是合理的。

    你的方法会奏效,是我自己用过很多次的方法。你有一个递归数据结构 TSomeClass包含进一步的列表 TSomeClass对象。以任何其他方式遍历此结构将更加复杂。

    关于delphi - 递归属性 (Delphi),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11929909/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com