【发布时间】:2013-03-17 19:05:52
【问题描述】:
根据this类似的StackOverflow问题和其他文章,C#方法默认是“非虚拟的”,我认为这意味着你不能在派生类中覆盖它们。
如果这是真的,您能否向我解释一下,在下面的示例中,我如何能够在继承自 Base 类的 Child 类中实现属性 LastName 而不将该属性标记为“虚拟”基类? Child.LastName 属性是否“隐藏”(VB“阴影”)基类中的相同属性?如果是这样,为什么 Child.LastName 属性中没有使用“新”关键字来表明这一点?
这个测试示例似乎向我暗示默认情况下方法和 virtual 并且在 LastName 属性的情况下,隐含“覆盖”,但我很确定这不是案子。
我错过了什么?
public class BaseClass
{
private string _FirstName;
public virtual string FirstName {
get { return _FirstName; }
set { _FirstName = value; }
}
private string _LastName;
public string LastName {
get { return _LastName; }
set { _LastName = value; }
}
public void Go()
{
MessageBox.Show("Going at default speed in Base Class");
}
public void Go(int speed)
{
MessageBox.Show("Going at " + speed.ToString() + " in Base Class");
}
}
public class Child : BaseClass
{
public override string FirstName {
get { return "Childs First Name"; }
set { base.FirstName = value; }
}
public string LastName {
get { return "Child's Last Name"; }
set { base.LastName = value; }
}
public void Go()
{
MessageBox.Show("Going in Child Class");
}
public void Go(int speed)
{
MessageBox.Show("Going at " + speed.ToString() + " in Child Class");
}
}
【问题讨论】:
-
我相信
Child.LastName是一个全新的属性,在这种情况下它遮蔽基类,并且被编译器提前绑定。试试((BaseClass) new Child()).LastName看看调用了哪个实现。 -
该代码应该在
FirstName、LastName和Go两种方法上向您发出警告,告诉您使用new -
你缺少的是你没有阅读编译器的输出,它告诉你你忘了说“新”。读取编译器输出;它通常会告诉你一些有趣的事情。