基类和派生类不能同时具有名称相同的私有嵌套类吗?

时间:2019-02-07 04:49:54

标签: c#

我有一个基类和派生类;两者都有一个嵌套的类。嵌套类彼此具有相同的名称,但是是私有的。我想知道为什么这行不通。

就我而言,嵌套类仅用于内部组织。嵌套类的名称为Properties。我曾尝试将派生类的Properties成员标记为声明时的new,但是Visual Studio表示没有要重写的成员。

这是我的结构的简化示例。

class SomeBaseEditor : Editor
{
    private class Properties
    {
        // properties specific to the base gui stored in here
    }

    private Properties properties = new Properties ();

    protected virtual void OnEnable ()
    {
        properties = new Properties (serializedObject);
    }
}
public class SomeBaseEditorImplementation : SomeBaseEditor
{
    private class Properties
    {
        // properties specific to the implementation's gui stored in here
    }
    // tried marking this as new, but Visual Studio said it wasn't hiding a member
    private Properties properties = new Properties ();

    protected override void OnEnable ()
    {
        properties = new Properties (serializedObject);
    }
}

此代码用于Unity中的自定义编辑器。有趣的是,编译后-在实际代码运行时,错误会抛出

当基类尝试访问其properties实例中的成员时,将引发空引用异常。我不认为这应该引发错误,因为两个类都是私有的,无法从任何地方访问。

如果我因错误而中断,并将鼠标悬停在properties变量上,Visual Studio将显示它包含派生类的嵌套私有类的成员!

我将举例说明我的情况。基础Properties类内部只有一个SerializedProperty。派生类的Properties类有五个SerializedProperty。当我中断基类的 properties实例(引发错误)时,它表明它包含来自派生类的5个SerializedProperty >!

这是我在Visual Studio中看到的内容: enter image description here

因此,它尝试访问的类中甚至没有声明该成员的成员。我很惊讶这个错误不是在编译时触发的,并且想知道为什么它首先不起作用。

这里有指向我的两个类的简化版本的链接,这些链接可能为我高度简化的示例的问题提供了更多背景信息

2 个答案:

答案 0 :(得分:0)

您确实没有提供a Minimal, Complete, and Verifiable example。话虽这么说,我很容易拥有一个基类和一个派生类,每个基类和一个派生类都具有相同名称的 duplicate 类和具有相同名称的属性。

DotNetFiddle Working Example

public static void Main()
{
    var foo2 = new Foo2();
    foo2.Foo1Go();  //Write "1"
    foo2.Foo2Go();  //Writes "2" then "1"
}

public class Foo1
{
    private class Bar { public int Id { get; private set; } = 1; }

    private Bar bar = new Bar();

    public void Foo1Go()
    {
        Console.WriteLine(bar.Id);
    }
}

public class Foo2 : Foo1
{
    private class Bar { public int Id { get; private set; } = 2; }

    private Bar bar = new Bar();

    public void Foo2Go()
    {
        Console.WriteLine(bar.Id);
        var foo1 = this as Foo1;
        foo1.Foo1Go();
    }
}

结果

  

1

     

2

     

1

答案 1 :(得分:0)

派生类的初始化方法OnEnable覆盖了基类的OnEnable,而没有调用基方法,因此从未分配基类的properties变量。奇怪的是,Visual Studio并没有说该变量为null,而是通过将派生类的OnEnable方法更改为调用base.OnEnable来消除错误。

protected override void OnEnable ()
{
    base.OnEnable ();
    properties = new Properties (serializedObject);
}