小例分析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です.