我确定这是重复的,但找不到答案。我是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] 删除。
我来说两句