仮想メソッドと非仮想メソッドの違いを次の例で示します。
using System;
class A
{
public void F() { Console.WriteLine("A.F"); }
public virtual void G() { Console.WriteLine("A.G"); }
}
class B: A
{
new public void F() { Console.WriteLine("B.F"); }
public override void G() { Console.WriteLine("B.G"); }
}
class Test
{
static void Main() {
B b = new B();
A a = b;
a.F();
b.F();
a.G();
b.G();
}
}
この例では、A は非仮想メソッド F および仮想メソッド G を導入します。クラス B は新規の非仮想メソッド F を導入します。これにより、継承された F は隠ぺいされ、かつ、継承されたメソッド G はオーバーライドされます。この例では、次のように出力されます。
A.F
B.F
B.G
B.G
なるほどね。でも親クラス(派生元)に対して、子クラス(派生先)のオブジェクトを突っ込むケースあるかなぁ。私の場合、抽象クラスなり抽象メソッドなり、abstractを使ってしまうことの方が多いんだけどなぁ。
Comments