古典的な問題(コンストラクション関数呼び出し+抽象クラス+間接継承抽象クラス)


クラシックケース1:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
abstract class Test1
{
public int Num1 { get; private set; }
public int Num2 { get; private set; }
public Test1(int num1,int num2)
{
Num1=num1;
Num2=num2;
}
public abstract int Sum();
}

class Test2:Test1
{
private int num3;
public Test2(int num1, int num2, int num3):base(num1,num2)
{
Num3 = Sum();// : Num3 Test3 Test2 ?
}
public int Num3
{
get { return num3; }
set { num3 = value; }
}
public override int Sum()
{
return ++Num3;
}
}

class Test3:Test2
{
private int num4;
public Test3(int num1, int num2, int num3,int num4):base(num1,num2,num3)
{
Num4 = num4;
}
public int Num4
{
get { return num4; }
set { num4 = value; }
}

//public override int Sum()// , , , 2 ,
//{
// return Num4+base.Sum();
//}

}

class P
{
static void Main()
{
Test3 onetest3 = new Test3(1,2,3,4);
}

}
}

質問:
抽象クラスを間接的に継承し、書き換え方法は親クラスの方法ですか、抽象クラスの方法ですか.
答え:抽象クラスを間接的に継承するクラス書き換え方法は親クラスの方法で、「近水楼台先得月」!注意:間接的に抽象クラスを継承し、書き換え方法は親クラスの方法で、直接抽象クラスを継承し、抽象クラスの方法については実現答えと呼ばれます:Test 3のSumメソッドに注釈がなければ:1.抽象クラスを直接継承するには、Test 22のような抽象クラスの抽象メソッドを実装する必要がある.オブジェクトはTest 3で作成され,Test 3は親Test 2のメソッドを書き換えているので,本クラスのSumメソッドを用いなければならない.Test 3のSumメソッドを注釈すると:1.抽象クラスを直接継承するには、Test 22のような抽象クラスの抽象メソッドを実装する必要がある.間接的に抽象クラスを継承する場合、Test 33のような抽象クラスの抽象方法を必ずしも実現する必要はない.間接的に抽象クラスを継承するクラスについては,抽象クラスメソッドを書き換えなければ,Test 3がTest 2のSum()メソッドを呼び出したような親クラスの実装抽象クラスメソッドを暗黙的に呼び出す.