2

親と子の木構造を作ろうとしています。問題は、子クラスと親クラスで子の親を割り当てることができるようにしたいだけで、他の場所には割り当てられないことです:

public class Parent
{
    public static Parent Root = new Parent();
    
    private List<Child> children = new List<Child>();
    public ReadOnlyCollection<Child> Children
    {
        get { return children.AsReadOnly(); }
    }

    public void AppendChild(Child child)
    {
        child.Parent.RemoveChild(child);
        child.children.Add(child);
        child.Parent = this; //I need to asign the childs parent in some way
    }
    public void RemoveChild(Child child)
    {
        if (this.children.Remove(child))
        {
            child.Parent = Parent.Root; //here also
        }
    }
}
public class Child : Parent
{
    private Parent parent = Parent.Root;
    public Parent Parent
    {
        get { return this.parent; }
        private set { this.parent = value; } //nothing may change the parent except for the Child and Parent classes
    }
}

C# 以外のプログラマーから、(C++ のように) フレンドを使用するように言われましたが、それらは C# では実装されておらず、他のすべてのソリューションは失敗しました。

4

3 に答える 3

3

子と親を実際に作成する責任もある場合 (このためのファクトリ メソッドを提供できます)、インターフェイスとプライベート クラスを使用してこれを実現できます。

interface IChild
{
    // methods and properties for child, including
    IParent Parent { get; } // No setter.
}

interface IParent
{
   // Methods and properties for parent
}

ここで、Parent セッターも持つのプライベート実装を作成します。コードでプライベート実装を呼び出しますが、とIChildのみを返します。IChildIParent

注 - プライベート クラスは、C# のネストされたクラスです。これらのクラスをどのクラスにネストする必要があるかはわかりません-それはプロジェクトによって異なります。そのような適切な場所がない場合は、子/親 DLL ライブラリを作成しinternal、パブリック インターフェイスを実装する Child クラスと Parent クラスを作成できます。

Parentちなみに、クラスとChildクラスの両方がある理由、特に Child が Parent から派生する理由がわかりません。Nodeクラスが 1 つある場合はParent、プライベート セッターを持つプロパティを持つことができ、それについて心配する必要はありません。

于 2015-01-04T09:21:06.447 に答える
2

これはあなたの質問に答えないかもしれませんが、代替手段です。これはノード構造であり、次のようなものを使用できます。

public class Node
{
    private Node _parent;
    private List<Node> _children = new List<Node>();

    public Node(Node parent)
    {
        _parent = parent
    }

    public ReadOnlyCollection<Node> Children
    {
        get { return _children.AsReadOnly(); }
    }

    public void AppendChild(Node child)
    {
        // your code
    }

    public void RemoveChild(Node child)
    {
        // your code
    }
}

@zmbq が似たようなものを提案するために編集したばかりだと思います。

于 2015-01-04T09:29:33.277 に答える