例overrideとnewの違いを説明する
5396 ワード
一、override:Overrideキーワードは主に派生クラス対ベースクラスメソッドの新しい実装を提供する.
1、虚でない方法と静的方法を書き換えてはいけない
2、これと組み合わせて使うキーワードはVirtual、abstract、Overrideです.
3、修飾子new、static、virtualまたはabstractを使用してoverrideメソッドを変更することはできません.
二、new:newキーワードは派生クラスにベースクラスのメソッドを隠すことができ、つまり派生クラス呼び出しを使用するメソッドはベースクラスのメソッドではなくNewキーワードで新しく定義されたメソッドである.Newキーワードを使用してベースクラスを非表示にする方法も可能です.コンパイラでは、ベースクラスを非表示にする方法が意図されている場合は、Newキーワード修飾を使用するように警告されます.
ベースクラスのダミーメソッド、通常メソッドを操作できます
三、Virtual:派生クラスでこれらのオブジェクトを書き換えることができます.デフォルトでは、メソッドは仮想ではなく、書き換えることはできません.virtualキーワードはstatic、abstract、private、overrideと一緒に使用できません.Virtualキーワードとoverrideは密接に区別できません.Virtualメソッドを実装するにはoverrideまたはnewキーワード(newとoverrideが生成するメカニズムが異なる)を使用する必要があります.
四、次の小さな例を説明して、辛抱強く読んで、一目瞭然です.
1、まずチェックしたのはすべて申明類です
2、申明類が虚方法である場合、実例類を検査する
3、インスタンスクラスが実装されていない場合は、親クラスの虚メソッドを使用します.(優先度の最後)
4、newの場合、継承クラスにも同名のメソッドがありますが、既に親クラスとは関係ありません.したがって、このメソッドは呼び出されません.サブクラスで宣言されたオブジェクトでない限り呼び出されません.
1、虚でない方法と静的方法を書き換えてはいけない
2、これと組み合わせて使うキーワードはVirtual、abstract、Overrideです.
3、修飾子new、static、virtualまたはabstractを使用してoverrideメソッドを変更することはできません.
二、new:newキーワードは派生クラスにベースクラスのメソッドを隠すことができ、つまり派生クラス呼び出しを使用するメソッドはベースクラスのメソッドではなくNewキーワードで新しく定義されたメソッドである.Newキーワードを使用してベースクラスを非表示にする方法も可能です.コンパイラでは、ベースクラスを非表示にする方法が意図されている場合は、Newキーワード修飾を使用するように警告されます.
ベースクラスのダミーメソッド、通常メソッドを操作できます
三、Virtual:派生クラスでこれらのオブジェクトを書き換えることができます.デフォルトでは、メソッドは仮想ではなく、書き換えることはできません.virtualキーワードはstatic、abstract、private、overrideと一緒に使用できません.Virtualキーワードとoverrideは密接に区別できません.Virtualメソッドを実装するにはoverrideまたはnewキーワード(newとoverrideが生成するメカニズムが異なる)を使用する必要があります.
四、次の小さな例を説明して、辛抱強く読んで、一目瞭然です.
class A
{
public virtual void Func() // virtual,
{
Console.WriteLine("Func In A");
}
}
class B : A // B A , A ,B
{
public override void Func() // override ,
{
Console.WriteLine("Func In B");
}
}
class C : B // C B , B ,C
{
}
class D : A // D A , A ,D
{
public new void Func() // new , ,
{
Console.WriteLine("Func In D");
}
}
class Program
{
static void Main(string[] args)
{
A a; // a A . A a
A b; // b A . A b
A c; // c A . A c
A d; // d A . A d
a = new A(); // a ,A a
b = new B(); // b ,B b
c = new C(); // c ,C c
d = new D(); // d ,D d
a.Func(); // a.Func:1. A 2. 3. A, 4. A 5. Func In A
b.Func(); // b.Func:1. A 2. 3. B, 4. B 5. Func In B
c.Func(); // c.Func:1. A 2. 3. C, 4. C B, 5. B Func 5. Func In B
d.Func(); // d.Func:1. A 2. 3. D, ( , D Func(), override , ) 4. D A, 5. A Func 5. Func In A
D d1 = new D();
d1.Func(); // D Func(), Func In D
Console.ReadLine();
}
}
1、まずチェックしたのはすべて申明類です
2、申明類が虚方法である場合、実例類を検査する
3、インスタンスクラスが実装されていない場合は、親クラスの虚メソッドを使用します.(優先度の最後)
4、newの場合、継承クラスにも同名のメソッドがありますが、既に親クラスとは関係ありません.したがって、このメソッドは呼び出されません.サブクラスで宣言されたオブジェクトでない限り呼び出されません.