誰かがこの2つの例の違いを説明してください。
クラスA
保護された仮想文字列GetData()
クラスB
プライベートオーバーライド文字列GetData()
また、
クラスA
保護された文字列GetData()
クラスB
プライベート文字列GetData()
「クラスB」は「クラスA」から継承すると仮定します。
メソッドのオーバーライドが必要な場合は、スーパークラスでは virtual
を使用し、サブクラスでは
override
を使用する必要があると常に考えていましたが、 。もしあれば、違いは何ですか?
ベストアンサー
表示された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()
実際、このサンプルは無効です。なぜなら、Derivedクラスの public new void
で
Test2()new
キーワードを使用する必要があるからです。
演算子のオーバーロードと同じように機能します。実際には何も上書きされません。正確な型 Derived
を持つと、新しいメソッドが呼び出されます。
You have to be really careful with hiding members, it is
nothing like overriding (classes) or implementing (interfaces) at
all. Only when you have the
exact type it’ll call a
new
method, otherwise it’ll still call the
base type’s method!