newとoverrideの違い

4778 ワード

まずoverrideの場合を見てください.
public class A
{
public A()
{
Console.WriteLine('A');
}
public virtual void Fun()
{
Console.WriteLine("A.Fun()");
}
}

public class B : A
{
public B()
{
Console.WriteLine('B');
}

public override void Fun()
{
Console.WriteLine("B.Fun()");
}
}

Bタイプのオブジェクトを宣言します.
B test = new B();test.Fun();
出力結果は次のとおりです.
ABB.Fun()
この結果,まずAを出力し,Bを出力し,初期化を説明するときはベースクラスを先に実行し,サブクラスのコンストラクタを実行する.
Aタイプのオブジェクトを宣言します.
A test = new B();test.Fun();
実行結果:
ABB.Fun()
親タイプでも子タイプでも、overrideを使用すると、親の虚関数がクラスの関数に完全に上書きされることを示します.
 
newの状況を見てみましょう.
public class A
{
public A()
{
Console.WriteLine('A');
}
public virtual void Fun()
{
Console.WriteLine("A.Fun()");
}
}

public class B : A
{
public B()
{
Console.WriteLine('B');
}

public new void Fun()
{
Console.WriteLine("B.Fun()");
}
}

 
Bタイプのオブジェクトを宣言します.
B test = new B();test.Fun();
出力結果は次のとおりです.
ABB.Fun()----overrideと同じ効果
Aタイプのオブジェクトを宣言します.
A test = new B();test.Fun();
実行結果:
ABA.Fun()----この時、overrideの場合とは違います...
 
結論:
1.new宣言の方法は、サブクラスのタイプを使用して呼び出されると、サブクラスの関数が実行され、タイプがベースクラスであれば、ベースクラスの関数を使用して実行され、簡単に記憶できます.
override--オーバーライド(親がいなくなって、ずっと息子)、new--新しい(親子共存)
PS:virtualを使用してベースクラスの関数を定義し、overrideを使用してサブクラスの関数をタグ付けしてこそ、マルチステートクラス--常にサブクラスを呼び出す方法が得られます.
2.子のoverride親のメソッド親のメソッドは、親のメソッドがvirtualである必要がありますが、子のnew親のメソッドでは、親のメソッドがvirtualである必要はありません.
3.抽象クラスの抽象メソッドは、布団クラスoverrideでなければなりません.newできません.
4.overrideはsealedキーワードと連用できます:sealed override void F()ですが、newはできません.sealedに修飾された方法は、布団類を書き直すことはできません
 
もう一つ複雑なネットで見た面接問題:
public class A
{
public virtual void Fun1(int i)
{
Console.WriteLine(i);
}

public void Fun2(A a)
{
a.Fun1(1);
Fun1(5);
}
}

public class B : A
{
public override void Fun1(int i)
{
base.Fun1(i + 1);
}
}

 
B b = new B();A a = new A();a.Fun2(b);b.Fun2(a);
上の文を実行します.実行結果は何ですか.
a.Fun 2(b):入力パラメータはB型であるため、a.Fun 1(1)はB型オブジェクトのFun 1メソッドを実行し、実行結果は2
そしてFun 1(5)を実行し、A型オブジェクトのFun 2メソッドを実行するので、Fun 1は当然AのFun 1であり、実行結果は5である
再分析b.Fun 2(a):入力パラメータはAタイプであるためa.Fun 1(1)はAタイプオブジェクトのFun 1メソッドを実行し,実行結果は1である.
そしてFun 1(5)を実行し、BタイプオブジェクトのFun 2メソッドを実行しているため、このときのFun 1は既にBで上書きされているので、上書きされたメソッドを実行し、実行結果は6
 
では、Bクラスのoverrideをnewに変更するとどうなるのでしょうか.
public void Fun 2(A a)のパラメータタイプは常にAタイプであるため(Bタイプが入力されるとAタイプに変わり、A a=new B()の効果に相当する)、親をnewで上書きしない方法であるため、結果は:
1
5
1
5