小例分析C#継承メカニズム
2774 ワード
using System;
class test
{
public class A
{
public virtual void fun1(int i)
{
Console.WriteLine(i);
}
public void fun2(A a)
{
a.fun1(3);
fun1(7);
}
}
public class B : A
{
public override void fun1(int i)
{
Console.WriteLine(i+1);
}
}
public static void Main()
{
A a = new A();
B b = new B();
a.fun2(b);
b.fun2(a);
}
}
上のプログラムでは,クラスBはクラスAを継承し,Main()関数でそれぞれこの2つのクラスのインスタンス変数a,bを生成する.
a.fun2(b);
1.オブジェクトaはまずAクラスのfun 2メソッドを呼び出し、fun 2(A a)はAタイプのインスタンス変数を必要とするが、ここでの実際のパラメータはBタイプのインスタンス変数bである.ここでは、bをAタイプに暗黙的に変換し、変換中にbは独自の特性を失うことになります.2.b.fun 1(3)を実行し、bのfun 1メソッドはAクラスのfun 1メソッドを上書きするので、ここでは実際にBクラスのfun 1メソッドを実行し、4(i+1)を印刷する.3.fun 1(7)を実行します.ここでは呼び出しオブジェクトは指定されていません.デフォルトは現在の呼び出しオブジェクトです.現在、aが呼び出されている場合、a.fun 1(7)が実行され、aがAクラスのインスタンス変数である場合、Aクラスのfun 1が実行され、7(i)が印刷される.
b.fun2(a);
1.Bクラスにfun 2メソッドがないため、親クラスAのfun 2メソッドが実行され、ここで実際のパラメータはAタイプのインスタンス変数aであるため、変換する必要はありません.2.a.fun 1(3)を実行し、3(i)を印刷します.3.fun 1(7)、すなわちb.fun 1(7)を実行し、8(i+1)を印刷する.
プログラムの最後の出力は4738です.