C#访问受保护的字段

1 c# inheritance

我想组织一个场景图.我有一般类SceneNode:

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; } }
}
Run Code Online (Sandbox Code Playgroud)

我也有类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;
    }
}
Run Code Online (Sandbox Code Playgroud)

IntelliSense表示无法从SceneNodeContainer访问node.parent和其他受保护字段.我怎么能克服这个?

Jon*_*eet 7

您不能,因为受保护的方式工作 - 它只允许访问已知为子类型(或子类型)的对象的受保护字段.因此,如果node是一个SceneNodeContainer变量,你可以访问这些字段 - 但是否则你没有.

从C#4规范的第3.5.3节:

当在声明它的类的程序文本之外访问受保护的实例成员时,并且当在声明它的程序的程序文本之外访问受保护的内部实例成员时,访问必须在类中进行声明派生自声明它的类.此外,需要通过该派生类类型的实例或从其构造的类类型进行访问.此限制可防止一个派生类访问其他派生类的受保护成员,即使这些成员是从同一基类继承的.

(顺便说一句,无论如何,我个人都会避开受保护的字段.我几乎在所有情况下都将非常量字段设为私有.)