0

たとえば、名前の付いたクラスがあると"Parent"します。彼には"Print". クラス"Kid"が派生したという名前のメソッドがあり、それには という名前のメソッドが"Print"ありますが、新しいものです。

new public void Print;

オブジェクトを作成しましょう:

Parent p = new Kid();

このオブジェクトのポインターでメソッド Print を使用すると、メソッドは「子供」ではなく、父の (「親」) メソッドになります。

しかし、仮想メソッドを使用している場合、そのメソッドは親ではなくキッドになります (Print が仮想の場合、「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 に答える