在C#中,为什么子类字段的默认值不覆盖超类字段的默认值?

GladstoneKeep

我确定这是重复的,但找不到答案。我是C#的新手,很难理解为什么会这样:

我有一类是从另一类继承的。我希望子类重写超类上的公共字段,在这种情况下为public field a但这似乎不起作用:

class Foo
{
   public string a = "x";

   public string A()
   {
      return a;
   }
}

class Bar : Foo
{
   public string a = "y";
}

...

new Foo().A() // Returns "x"
new Bar().A() // Returns "x" also...why?

我希望最后一行返回,"y"但它返回"x",而忽略了我已覆盖a字段值的事实为什么不起作用?以及获得我想要的行为的标准方法是什么?

csharp如果需要的话,我正在REPL中输入此代码

谜团

您的代码遮盖了该字段,而不是覆盖它。

等效于以下代码:

class Bar : Foo
{
    public new string a = "y";
}

您的编译器应已对此代码发出警告。

现在,由于要进行阴影处理,这意味着在A对字段in的调用中使用了该字段,Foo就像字段inBar不存在。

您无法覆盖字段,但是如果将字段更改为属性,则可以执行以下操作:

class Foo
{
    public virtual string a { get; set; } = "x";

    public string A()
    {
        return a;
    }
}

class Bar : Foo
{
    public override string a { get; set; } = "y";
}

现在,您的代码将按照您最初认为的那样运行:

void Main()
{
    Console.WriteLine(new Foo().A()); //x
    Console.WriteLine(new Bar().A()); //y
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在C#中,为什么子类字段的默认值不覆盖超类字段的默认值?

来自分类Dev

具有Java中构造函数默认值的超类覆盖子类

来自分类Dev

在Rails表单输入字段中覆盖迁移默认值

来自分类Dev

计算字段中的默认值

来自分类Dev

实例在struct字段中的默认值

来自分类Dev

在phpmyadmin中更改字段默认值

来自分类Dev

为什么kafka-avro-console-producer不遵守该字段的默认值?

来自分类Dev

Django字段中默认值的规则是什么?

来自分类Dev

为什么子类不覆盖其超类变量的值?

来自分类Dev

为什么子类不覆盖python中基类的字段以及如何处理

来自分类Dev

为什么子类不覆盖python中基类的字段以及如何处理

来自分类Dev

C ++中类成员的默认值

来自分类Dev

MS SQL在NOT NULL字段上显式使用“默认默认值”-为什么?

来自分类Dev

在C#中设置默认值

来自分类Dev

在C#中设置默认值

来自分类Dev

Elasticsearch Date字段的默认值

来自分类Dev

django选择字段的默认值

来自分类Dev

原则:joinColumn字段的默认值

来自分类Dev

字段“区”没有默认值

来自分类Dev

字段没有默认值

来自分类Dev

如何更改舞台字段的默认值

来自分类Dev

django选择字段的默认值

来自分类Dev

设置Bindy字段的默认值

来自分类Dev

不显示输入字段的默认值

来自分类Dev

Google表单嵌入字段的默认值

来自分类Dev

Django字段的默认值是多少?

来自分类Dev

django:非空字段的默认值

来自分类Dev

字段没有默认值

来自分类Dev

Elasticsearch Date字段的默认值