■ :this()
* 別のコンストラクタを呼び出す
サンプル
public class SampleConstractorClass
{
public SampleConstractorClass()
{
Console.WriteLine("Call!");
}
public SampleConstractorClass(string a)
: this()
{
Console.WriteLine("Call : " + a);
}
public SampleConstractorClass(int b)
: this("from b")
{
Console.WriteLine("Call : " + b);
}
public SampleConstractorClass(double c)
{
Console.WriteLine("Call : " + c);
}
}
private void button1_Click(object sender, EventArgs e)
{
SampleConstractorClass t1 = new SampleConstractorClass();
Console.WriteLine();
SampleConstractorClass t2 = new SampleConstractorClass("t2");
Console.WriteLine();
SampleConstractorClass t3 = new SampleConstractorClass(3);
Console.WriteLine();
SampleConstractorClass t4 = new SampleConstractorClass(4.5);
Console.WriteLine();
}
出力結果
Call!
Call!
Call : t2
Call!
Call : from b
Call : 3
Call : 4.5
■ :base()
* :base()は、以下のような問題を解決できる
問題点
* クラスに継承関係がある時、継承元クラスのコンストラクタ実行後、
継承先クラスのコンストラクタが実行されるが、継承元クラスのコンストラクタへ引数は渡せない。
* 引数の無いコンストラクタが定義されていないクラスの場合、コンパイルエラーとなってしまう
サンプル
public class ClassBase
{
public ClassBase()
{
Console.WriteLine("Call Base!");
}
public ClassBase(string a)
{
Console.WriteLine("Call Base: " + a);
}
}
public class ClassSub : ClassBase
{
public ClassSub()
{
Console.WriteLine("Call Sub!");
}
public ClassSub(string a)
: base(a + " from Sub") // ★
{
Console.WriteLine("Call Sub: " + a);
}
public ClassSub(int b)
{
Console.WriteLine("Call Sub: " + b);
}
}
private void buttonF_Click(object sender, EventArgs e)
{
ClassBase t1 = new ClassBase();
Console.WriteLine();
ClassBase t2 = new ClassBase("t2");
Console.WriteLine();
ClassSub t3 = new ClassSub();
Console.WriteLine();
ClassSub t4 = new ClassSub("t4");
Console.WriteLine();
ClassSub t5 = new ClassSub(5);
Console.WriteLine();
}
出力結果
Call Base!
Call Base: t2
Call Base!
Call Sub!
Call Base: t4 from Sub
Call Sub: t4
Call Base!
Call Sub: 5