我有一个基类和派生类;两者都有一个嵌套的类。嵌套类彼此具有相同的名称,但是是私有的。我想知道为什么这行不通。
就我而言,嵌套类仅用于内部组织。嵌套类的名称为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
>!
因此,它尝试访问的类中甚至没有声明该成员的成员。我很惊讶这个错误不是在编译时触发的,并且想知道为什么它首先不起作用。
这里有指向我的两个类的简化版本的链接,这些链接可能为我高度简化的示例的问题提供了更多背景信息
答案 0 :(得分:0)
您确实没有提供a Minimal, Complete, and Verifiable example。话虽这么说,我很容易拥有一个基类和一个派生类,每个基类和一个派生类都具有相同名称的 duplicate 类和具有相同名称的属性。
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);
}