【发布时间】:2021-03-01 05:43:08
【问题描述】:
我确定这是重复的,但我找不到答案。我是 C# 新手,无法理解为什么会发生这种情况:
我有一个类继承自另一个类。我希望子类覆盖超类上的公共字段,在本例中为公共字段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,如果这很重要的话。
【问题讨论】:
-
方法被覆盖,而不是字段。您可以为此行为使用虚拟方法。
-
请注意编译器警告:
'Bar.a' hides inherited member 'Foo.a'. Use the new keyword if hiding was intended。这暗示了这段代码有什么不好的地方,事实上,你并没有像你想象的那样覆盖该字段。
标签: c#