gpt4 book ai didi

c# - C# 中具有父引用的文件和文件夹结构的复合模式

转载 作者:行者123 更新时间:2023-11-30 12:14:16 25 4
gpt4 key购买 nike

我目前正在努力实现一组文件系统类。如果我没记错的话,我想这需要复合模式。所以我设置了以下类:

一个抽象类Node,它引用了它的父文件夹,还有两个类FolderFile 实现了Node。文件夹包含其所有子项的集合以及添加和删除子项的方法。

问题是,我不知道如何正确地实现所有方法。在我看到的所有示例中,都没有提及子项中的父项。 AddChild 方法如何确保子项的父引用设置正确?我通过检查是否已将 child.Parent 设置到该文件夹​​或抛出 ArgumentException 来解决该问题。由于 AddChild 也可能抛出类似 DuplicateNameException 之类的异常,事情变得更加复杂。所以我的方法现在看起来像这样:

File.AddTo(Folder folder) {
this.Parent = folder;
try {
folder.AddChild(this);
} catch {
this.Parent = null;
throw;
}
}

Folder.AddChild(Node child)
{
if(child.Parent != this)
throw new ArgumentException(...);
...
}

现在我有了这个丑陋的 AddTo 方法,不能做类似 someFolder.AddChild(new File(...)) 的事情。例如,我想知道它是如何用 ListViewItem 实现的。我可以在那里做 someListView.Items.Add(new ListViewItem(...))

我的解决方案有效,但我不相信这是执行此操作的正确方法。也许有人有更好的解决方案或者可以给我一个很好的例子。提前致谢。

编辑:下面是最小的完整类定义。

abstract class Node
{
public Folder Parent { get; protected set; }
public string Name { get; private set; }

public Node(string name) {
Parent = null;
Name = name;
}
}

class Folder : Node {
private Dictionary<string, Node> _children;

public Folder(string name) : base(name) {
// Other initializations here...
}

public void AddChild(Node child) {
if(child is Folder)
((Folder)child).Parent = this; // Damn, doesn't work for files!!!
else if(child.Parent != this)
throw new ArgumentException();

if(_children.ContainsKey(child.Name))
throw new DuplicateNameException();

_children[child.Name] = child;
}
}

class File : Node {
public File(string name) : base(name) {
// Other initializations here...
}

public void AddTo(Folder folder) {
Parent = folder;
try {
folder.AddChild(this);
} catch {
Parent = null;
}
}
}

最佳答案

反之亦然:

Folder.AddChild(Node child) 
{
child.Parent = this;
this._children.Add(child); // or what ever your doing to store the children
...
}

关于c# - C# 中具有父引用的文件和文件夹结构的复合模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9915997/

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