現在、ファイルシステムクラスの実装には苦労しています。私は間違っていない場合、これは複合パターンを必要とすると思います。だから私は、次のクラスを設定します。C#の親参照を持つファイルとフォルダ構造の複合パターン
その親フォルダを参照すると、二つのクラスFolder
とNode
を実装File
を持っている抽象クラス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(...))
を行うことができます。
私のソリューションは機能しますが、これを行うのが正しい方法であるとは私は確信していません。たぶん誰かがより良い解決策を持っているか、私に良い例を教えてくれるかもしれません。前もって感謝します。
EDIT:下記の完全なクラスの定義。
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;
}
}
}
現在、ファイル、フォルダ、ノードの定義はありますか? – KazR