有两个类(分别是父子类):
class Unit
{
protected string UnitChar = ".";
public string Char
{
get => UnitChar;
}
public void Print() => Console.WriteLine(Char);
}
class Pawn : Unit
{
protected new string UnitChar = "P";
}
在继承的类中,我UnitChar用字符串覆盖该字段"P"。根据我的想法,继承的方法和属性Pawn,当从其实例调用时,应该使用其依赖于重写字段的字段和属性。换句话说,Print类中的继承方法Pawn必须使用 property Char,而 property 又返回重写的UnitChar.
然而,下面的代码:
Unit U = new();
Pawn P = new();
U.Print();
P.Print();
Console.WriteLine($"{U.Char} {P.Char}");
输出:
.
.
. .
虽然预计:
.
P
. P
不。仅当关键字存在时才会发生重新定义
override。然后在方法中,Print当访问属性时,Char运行时会将其作为虚拟方法调用,并检查类型表以确定应该调用哪个方法,是原始方法还是后继方法。而关键字
new只是“隐藏”了原始方法并提供了一个新的实现(尽管它具有相同的名称),只有当编译器在编译时确定正在访问该方法的这个“版本”时才会调用该实现。例如,如果在您要执行的代码版本中
new Pawn().UnitChar(假设是public),那么按照预期,它将返回P而不是.。这样做会更正确(按照作者的想法):
另一个答案里有解释。我想澄清的是,新关键字“隐藏”继承的字段并创建它的新定义(尽管它具有相同的名称),该定义不会早于此类中(在继承层次结构中)使用。