例如,如果我有一个名为"Parent"
的类。他有一个名为"Print".
的方法
类"Kid"
是派生的,它有一个名为"Print"
的方法,但是有一个新方法。
new public void Print;
让我们创建一个对象:
Parent p = new Kid();
如果我将使用方法Print使用此对象的指针 该方法将是父亲的(“父”)方法,而不是“孩子”。
但是当我使用虚拟方法时,该方法将是Kid's而不是父方法。(如果Print是虚拟的,则“Kid”中的print会覆盖方法“)
为什么?
答案 0 :(得分:1)
答案 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