C++/CLIをつつく15-継承。親から子へ。
インドリ「どうしたんだい、ドリィちゃん?年のことをまだ言っているの?」
インドリィちゃん「年はいうな。それよりも私は鳥じゃない。」
インドリ「うっ、そうだね。でもまぁ細かいことは良いじゃないか。」
インドリィちゃん「あんたと一緒なのが嫌。」
インドリ「・・・」
ということで、前回のサンプルを手直しすることとなったピヨ。じゃあ早速新しいクラスを追加してみよう。
public ref class Human
{
private:
Int32 m_age;
String^ m_name;
Bird(){}
public:
property Int32 Age {
Int32 get() { return this->m_age; }
void set( Int32 value ) {
if ( value > 0 ) m_age = value;
}
}
property String^ Name;
Bird ( String^ name, Int32 age ) {
this->Name = name;
this->Age = age;
}
void Talk( ) {
Console::WriteLine( "私は{0}。年は{1}だよ。",
this->Name, this->Age);
}
};
みてのとおり内容はBirdクラスとまったく同じピヨ。うーん、面倒くさいな。同じ事を何度も書くというのは面倒じゃない?
PCは便利だからコピー&貼り付けしたら簡単だけど、後でBirdクラスとHumanクラスで共通の処理を思いついたら、
どちらかで実装してテストしてからまたHumanクラスにコピーしなくちゃならない。
この例の場合2つだからいいけど、これがもし1000個だったらみんなどうする?
もう面倒だというレベルじゃなくて苦痛だよね。
それに、人間は(もちろん鳥も)間違いがあるから、コピー&貼り付けではバグを生むよね。
コピーを一回でも忘れたら・・・「バグ一つでシステム~ダウンさ~♪you are shock♪
俺の鼓動早くなーる♪ 過労で鼓動早くなーる♪
いまさら何を言ってもむ~だだよ。まともな奴は~デスマーチでダウンさー♪」
ってなるよね。 そうならないためには、何度も同じ事を書かなければいいピヨ。みんなは「そんな旨い話しあるわけ無い。きっと詐欺だ」 と思うかもしれないけど、ボクの種類は鷺(サギ)では無いし、その方法もちゃんと用意されているピヨ。 そのコピペ地獄の人を救う女神が継承という機能なんだ。 みんな早く知りたいだろうから早速コードを披露するピヨッ。
//共通の要素を定義したクラスを実装
public ref class Animal
{
private:
Int32 m_age;
String^ m_name;
Animal(){}
public:
property Int32 Age {
Int32 get() { return this->m_age; }
void set( Int32 value ) {
if ( value > 0 ) m_age = value;
}
}
property String^ Name;
Animal ( String^ name, Int32 age ) {
this->Name = name;
this->Age = age;
}
void Talk( ) {
Console::WriteLine( "私は{0}。年は{1}だよ。",
this->Name, this->Age);
}
};
public ref class Bird : Animal //<-ツンツン
{
public:
//ここに注目
Bird ( String^ name, Int32 age ) : Animal( name, age ) { }
};
public ref class Human : Animal //<-ツンツン
{
public:
//ここに注目
Human ( String^ name, Int32 age ) : Animal( name, age ) { }
};
はやる気持ちを抑えて一つずつ突っ突いていこう。まず最初の手順としては
共通する要素を定義したクラスを定義する事ピヨ。
それさえすれば後は簡単。
public class Bird : Animalと書いて元となるクラスを指定するだけピヨ。 楽チン楽チン。この方法だと1000個のクラスも簡単に修正できるよね。
ちなみに、継承する方のクラスを子クラスと呼び、 共通の要素を定義したクラスを親クラスと呼ぶピヨ。 覚えておいてね。 でも一つだけ注意があるピヨ。C++/CLIではコンストラクタを必ず定義しないといけないピヨ。 そうしないとC++/CLIコンパイラから注意されるぞ。慌てないで対処しよう。 それで肝心なコードの内容だけど、親クラスと同じ引数を取るコンストラクタを定義して、
: Animal ( name, age )とすればいいピヨ。そうすれば、親のコンストラクタが呼び出されて処理をしてくれるピヨ。 さっきは簡単と書いたけども実は継承にはまだ色々あるんだ。ごめんね。 でも、一度に全てを書いたら混乱すると思うから少しずつ必要なときに書いていくね。 ということで今回はお終い。またみてね。