0

例如,如果我有一个名为的类"Parent"。他有一个名为派生"Print". 类的方法,它有一个名为 的方法,但是是一个新方法。"Kid""Print"

new public void Print;

让我们创建一个对象:

Parent p = new Kid();

如果我将方法 Print 与该对象的指针一起使用,则该方法将是父亲的(“Parent”)方法,而不是“Kid”。

但是当我使用虚拟方法时,该方法将是孩子的而不是父母。(如果打印是虚拟的,“孩子”中的打印会覆盖方法“)

为什么?

4

3 回答 3

1

您没有覆盖继承类中的方法 - 您正在隐藏它。

代替:

public new void Print();

利用:

public override void Print();
于 2012-07-28T10:42:58.660 回答
1

当您将 new 关键字用于与父方法具有相同签名的方法时,它会隐藏父方法。遮蔽不同于覆盖。阴影意味着如果实例和变量都是子类型,则将调用您的新方法。而覆盖确保无论变量是子类型还是父类型,都会调用覆盖的方法。

编辑:

看看 MSDN 上的比较表

于 2012-07-28T10:45:59.910 回答
0

虚拟方法调用使用对象的实际类型来确定调用哪个方法,而非虚拟方法使用引用的类型。

说你有:

public class Parent {
  public void NonVirtualPrint() {}
  public virtual void VirtualPrint() {}
}

public class Kid : Parent {
  public new void NonVirtualPrint() {}
  override public void VirtualPrint() {}
}

然后:

Parent p = new Parent();
Parent x = new Kid();
Kid k = new Kid();

p.NonVirtualPrint(); // calls the method in Parent
p.VirtualPrint(); // calls the method in Parent

x.NonVirtualPrint(); // calls the method in Parent
x.VirtualPrint(); // calls the method in Kid

k.NonVirtualPrint(); // calls the method in Kid
k.VirtualPrint(); // calls the method in Kid
于 2012-07-28T11:14:44.667 回答