虚拟方法

时间:2012-07-28 10:38:35

标签: c#

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

new public void Print;

让我们创建一个对象:

Parent p = new Kid();

如果我将使用方法Print使用此对象的指针 该方法将是父亲的(“父”)方法,而不是“孩子”。

但是当我使用虚拟方法时,该方法将是Kid's而不是父方法。(如果Print是虚拟的,则“Kid”中的print会覆盖方法“)

为什么?

4 个答案:

答案 0 :(得分:1)

你没有覆盖继承类中的方法 - 你是shadowing它。

而不是:

public new void Print();

使用:

public override void Print();

答案 1 :(得分:1)

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

编辑:

查看MSDN上的comparison sheet

答案 2 :(得分:0)

我不确定你在问什么,但是this article对C#中的多态性进行了很好的报道。

答案 3 :(得分: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