シーングラフを整理します。 私は、一般的なクラスのSceneNodeを持っている:C#保護されたフィールドへのアクセス
public class SceneNode
{
protected SceneNode prev, next;
protected SceneNodeContainer parent;
public SceneNode Parent { get { return parent; } }
public SceneNode PreviousNode { get { return prev; } }
public SceneNode NextNode { get { return next; } }
}
私もこのようなものですクラスSceneNodeContainerを、持っている:
public class SceneNodeContainer : SceneNode
{
SceneNode firstChild, lastChild;
public SceneNode FirstChild { get { return firstChild; } }
public SceneNode LastChild { get { return lastChild; } }
public void Add(SceneNode node)
{
Debug.Assert(node != null);
Debug.Assert(node.parent == null);
node.parent = this;
node.prev = lastChild;
node.next = null;
if (lastChild == null)
{
lastChild = node;
firstChild = lastChild;
}
else
{
lastChild.next = node;
lastChild = node;
}
}
public void Remove(SceneNode node)
{
Debug.Assert(node != null);
Debug.Assert(node.parent == this);
//unlink node
if (node.next != null)
node.next.prev = node.prev;
if (node.prev != null)
node.prev.next = node.next;
if (node == firstChild)
firstChild = node.next;
if (node == lastChild)
lastChild = node.prev;
node.parent = null;
node.next = null;
node.prev = null;
}
}
IntelliSenseがnode.parentや他の保護フィールドがSceneNodeContainerからアクセスできないことを言います。どうすればこれを克服できますか?
"ほとんどの場合、非定数フィールドを非公開にします。" - あなたはデザインが貧弱であるか、または個人的な好みの症状であると考えていますか? –
@ウィリアム:デザイン。フィールドは実装の詳細であり、公開されたAPIの一部であってはなりません。 –
これは通常、私と一緒に起こるので、ソリューションはこの質問を投稿した直後に表示されます。 SceneNodeクラスにはAddAfterメソッドとAddBeforeメソッドが追加され、SceneNodeContainerには空のSceneNodeが最初の子として追加されます(ヘッダーリストのようになります)。そして私はフィールドを隠すことに同意します。私はそれらを基本構造体でのみ開きます。 – lazychaser