override
オーバーライドとは、そのメソッドが基本クラスで として定義されている場合に、子孫クラスでメソッドの新しい実装を提供することですvirtual
。
非表示とは、そのメソッドが基本クラスで として定義されていないvirtual
場合、または新しい実装で が指定されていない場合に、子孫クラスでメソッドの新しい実装を提供する場合ですoverride
。
隠れることはしばしば悪いことです。まったく回避できる場合は、通常、それを行わないようにする必要があります。隠しメソッドは、基本クラス参照を使用する場合ではなく、定義した実際の型の変数で呼び出されたときにのみ使用されるため、非表示にすると予期しないことが発生する可能性があります... 一方、オーバーライドされた仮想メソッドは、子クラスの基本クラス参照を使用して呼び出された場合でも、適切なメソッド バージョンが呼び出されます。
たとえば、次のクラスを考えてみましょう。
public class BaseClass
{
public virtual void Method1() //Virtual method
{
Console.WriteLine("Running BaseClass Method1");
}
public void Method2() //Not a virtual method
{
Console.WriteLine("Running BaseClass Method2");
}
}
public class InheritedClass : BaseClass
{
public override void Method1() //Overriding the base virtual method.
{
Console.WriteLine("Running InheritedClass Method1");
}
public new void Method2() //Can't override the base method; must 'new' it.
{
Console.WriteLine("Running InheritedClass Method2");
}
}
一致する参照で、InheritedClass のインスタンスを使用して、このように呼び出しましょう。
InheritedClass inherited = new InheritedClass();
inherited.Method1();
inherited.Method2();
これは期待どおりの結果を返します。どちらのメソッドも、InheritedClass バージョンを実行していると言っています。
InheritedClass Method1 の
実行 InheritedClass Method2 の実行
このコードは、同じ InheritedClass のインスタンスを作成しますが、それを BaseClass 参照に格納します。
BaseClass baseRef = new InheritedClass();
baseRef.Method1();
baseRef.Method2();
通常、OOP の原則の下では、上記の例と同じ出力が期待されます。しかし、同じ出力は得られません:
InheritedClass Method1 の
実行 BaseClass Method2の実行
Method2()
InheritedClass コードを作成したときに、 へのすべての呼び出しで、作成したコードを実行したい場合があります。通常、これがどのように機能するかです -virtual
オーバーライドしたメソッドで作業していると仮定します。ただし、new
/hidden メソッドを使用しているため、代わりに、使用している参照のバージョンが呼び出されます。
それがあなたが本当に望む振る舞いなら、; どうぞ。ただし、それが必要な場合は、コードに大きなアーキテクチャ上の問題がある可能性があることを強くお勧めします。