我正在编写一个应用程序,它正在映射需要保存有关每个文件尽可能多信息的目录结构,以便最终用户可以应用自定义过滤器来操作文件和文件夹。该类还提供基本信息返回到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
包含一个文件夹,因此,如果那里有名为data的文件夹,则会有一个表示C:\ Data文件夹的子对象,并且SomethingToBeCounted
将是每个文件夹中文件的数量。现在我想在
GetSomethingToBeCounted
函数中执行以下操作:1. 查看是否有子对象(这很容易)。 2. 如果有子对象,请查询其
SomethingToBeCounted
属性,这将调用GetSomethingToBeCounted
函数以返回类 B 的FSomethingToBeCounted
字段的值,但是该函数应根据类的HasTheDataChanged
状态进行操作。这就是我希望递归发挥作用的地方
- 如果任何包含的子对象的HasTheDataChanged
属性设置为false,则其数据已经更新,然后应返回其值,不需要进行更多处理。
- 如果HasTheDataChanged
属性设置为true,则数据不是最新的,应重新计算并返回新重新计算的值。还应设置相应的HasTheDataChanged
状态,以便减少进一步的重新处理。
3. 我还假设必须对HasTheDataChanged属性执行类似的传播,以便如果树中某个地方的值发生更改,则所有父对象都将相应地更新。希望这些要求有意义。
现在是问题的核心。首先,我的想法是否正确,只需访问子对象的属性即可将正确的值传播到根对象,因此无需搜索每个子对象的成千上万行代码。或者,我正在尝试重新发明轮子,并且可以使用已经存在的类而不是制作自己的类。最后但并非最不重要的是,这是否是最有效的方法?