表示された2番目の例では、親のGetDataが表示されず、上書きされません。
例:
private class Base
{
public virtual void Test()
{
Console.WriteLine("Base");
}
public void Test2()
{
Console.WriteLine("Base");
}
}
private class Derived : Base
{
public override void Test()
{
Console.WriteLine("Derived");
}
public void Test2()
{
Console.WriteLine("Derived");
}
}
static void Main()
{
Base b = new Base();
Derived d = new Derived();
Base dInB = new Derived();
b.Test();
d.Test();
dInB.Test();
b.Test2();
d.Test2();
dInB.Test2();
Console.ReadKey(true);
}
それは出力:
Base // Base.Test()
Derived // Derived.Test()
Derived // Derived.Test()
Base // Base.Test2()
Derived // Derived.Test2()
Base // You think you're calling Derived.Test2(), but you actually call Base.Test2()
それが派生クラスでpublic new void Test2()
でnew
キーワードを使用する必要がありますので、実際にこのサンプルは、無効です。
オペレータのオーバーロードと同じように機能します。実際には何も上書きされません。正確なタイプがDerived
の場合、新しいメソッドが呼び出されます。
メンバを隠すことには本当に注意する必要があります。オーバーライド(クラス)や実装(インターフェイス)のようなものではありません。正確なタイプの場合にのみ、new
メソッドが呼び出されます。それ以外の場合は、基本タイプのメソッドが呼び出されます。
B.GetData()の下に波打ちがありますか? View + Error Listに警告が表示されますか?あなたがやっていることを知っているときは、* new *キーワードを使用してください。 –
最初の例では、Bのメソッドをプライベートにすることはできません。それはコンパイルされません。 – TrueWill