Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 试图给超类中的变量赋予新值的子类_C# - Fatal编程技术网

C# 试图给超类中的变量赋予新值的子类

C# 试图给超类中的变量赋予新值的子类,c#,C#,我正在尝试这样做,但不断出现错误: superclass.example是一个字段,但与类型一样使用 如果要在类层次结构中两次定义示例字段,请执行以下操作: public class superclass { public string example; public class subclass: superclass { public class subsubclass: subclass

我正在尝试这样做,但不断出现错误:

superclass.example是一个字段,但与类型一样使用


如果要在类层次结构中两次定义示例字段,请执行以下操作:

public class superclass
    {
        public string example;
        public class subclass: superclass
        {
            public class subsubclass: subclass
            {

                public string example = "blahblah";
            }
        }
    }
但你可能想做的是:

public class superclass
{
    public string example;
    public class subclass: superclass
    {
        public class subsubclass: subclass
        {

            public new string example = "blahblah";
        }
    }
}
第一个示例将使用相同的类型和名称在子类上创建一个新的、相同的字段。我无法想象这样的情景会有什么意义。这只会导致混乱。想象一下这样做:

public class superclass
{
    public string example;
    public class subclass: superclass
    {
        public class subsubclass: subclass
        {
            public subsubclass()
            {
                 example = "blahblah";
            }
        }
    }
}
其中DoSomething看起来像这样:

var myObj = new subsubClass();
myObj.example = "something";
DoSomething(myObj);
上面的代码将导致tmp为null,而不是一些人所期望的“某物”。除非您有充分的理由这样做,否则请避免使用新运算符(如果您自己编写所有类,则几乎从不使用)


TL;DR:如果您只想让子类设置属性,请在构造函数中进行设置。

这似乎不是一个好的设计。你有一个真实的szenario世界,你想在那里做这件事吗?通常,基类将定义属性,子类可以设置此属性。而不是相反,我在示例代码的任何地方都看不到
名称
字段。实际上,它打印了一条警告:
“…superclass.subclass.subsubclass.example”“隐藏继承的成员”…superclass.example”。如果打算隐藏,请使用new关键字。
如果您已经建议在类成员(字段)上使用
new
修饰符,您可能还应该建议使用此修饰符的典型危险……好吧。我声明我无法想象在子类上用相同的字符串字段重写字符串字段是有意义的,但我将添加另一个警告词。谢谢
void DoSomething(superclass myObj)
{
    var tmp = myObj.example;
}