長いコメント書くぐらいなら記事にしてしまえシリーズ #1
いんすぱいあーどばい「基本クラスのコンストラクタ」
コンストラクタをオーバーライドしていっぱい作ったり、継承しているときに初期化の一部を基本クラスに依頼するときなどにコンストラクタイニシャライザを使います。
C#だとこんな感じ。
class A
{
private int x;
public A() : this(0) {} // ここですぐ下の引数を一つ取るコンストラクタに仕事丸投げ
public A(int x)
{
this.x = x;
}
public virtual void output()
{
Console.WriteLine("x = " + x);
}
}
class Aplus : A
{
private int y;
public Aplus() : this(0, 0) {} // ここですぐ下の引数を二つ取るコンストラクタに仕事丸投げ
public Aplus(int x, int y) : base(x) // ここで派生クラスのコンストラクタを呼び出す
{
this.y = y;
}
public override void output()
{
base.output();
Console.WriteLine("y = " + y);
}
}
でも、C++だとコンストラクタイニシャライザにthisポインタが使えないので、自分自身の別のコンストラクタを呼び出すことができない。
使えるとするとこんな感じ。
class A
{
private:
int x;
public:
A():this(0){} // エラー!本当はここですぐ下の引数を一つ取るコンストラクタに仕事を投げたい!
A(int x)
{
this->x = x;
}
virtual void output()
{
cout << "x = " << x << endl;
}
};
class Aplus:public A
{
private:
int y;
public:
Aplus():this(0,0){} // エラー!本当はここですぐ下の引数を二つ取るコンストラクタに仕事を投げたい!
Aplus(int x, int y):A(x) // 基本クラスのコンストラクタなら呼び出せる。
{
this->y = y;
}
void output()
{
A::output();
cout << "y = " << y << endl;
}
};
なんでC++やと使えへんのかなぁ?
同じコードをあっちこっちに書くとメンテナンス性が落ちるがなぁ。
初期化用のprivateメソッド作ってそれをコンストラクタから呼び出すしかないんかな?
# と、疑問だけ投げかけて放置してみる。