根据这个类似的StackOverflow问题和其他文章,C#方法默认情况下是“非虚拟的”,这意味着您不能在派生类中重写它们。
如果这是真的,那么你可以解释一下,在下面的示例中,我如何能够在Child类中实现LastName属性,而没有将该属性标记为基类中的“virtual”?Child.LastName属性是否隐藏了(VB“Shadows”)基类中的同一个属性?如果是这样,为什么Child.LastName属性中不使用“new”关键字来指示这一点?
这个测试示例似乎向我表明方法和默认情况下是虚拟的,在LastName属性的情况下,“覆盖”是暗示的,但我很确定这不是事实。
我漏掉了什么?
如果这是真的,那么你可以解释一下,在下面的示例中,我如何能够在Child类中实现LastName属性,而没有将该属性标记为基类中的“virtual”?Child.LastName属性是否隐藏了(VB“Shadows”)基类中的同一个属性?如果是这样,为什么Child.LastName属性中不使用“new”关键字来指示这一点?
这个测试示例似乎向我表明方法和默认情况下是虚拟的,在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
来查看调用哪个实现。 - millimooseFirstName
、LastName
和两个Go
方法上警告你使用new
。 - shf301