C#をつつく16-抽象型。時には曖昧に。
実は前回のプログラムには凄くおかしなところがあります。
さて、それはどの点でしょうか?
チッチッチッチチッチッチッチチッチッチッチチッチッチッチチッチッチッチチッチッチッチ
時間切れピヨ。さて答えを発表するぞ。
答えは・・・Animalクラスのインスタンスを作れる事ピヨ。
動物って、凄く曖昧な表現だよね。その曖昧なもののインスタンス化を認めちゃうとおかしなプログラムが出来上がる。 この短い例だとわかりにくいかもしれないけど、動物園の管理システムを作っている事を想像してごらん。 動物に名前と年齢をつけるって事は、動物園の人達が「何の動物か分からない無いけど飼育している」状態なんだ。 おかしいよね。それじゃ未確認飛行物体ならぬ未確認生命体だよ。まぁ、実際存在したら凄く魅力的な動物園だけどね。 それじゃあ普通はプログラムのエーラーと捉えるよね? ということで、Animalクラスのインスタンス化を禁止するコードを実装するピヨ。 とぉー
//宣言に注目
public abstract class Animal
{
private string m_Name;
public string Name {
get { return m_Name; }
set { m_Name = value; }
}
private int m_Age;
public int Age {
get { return m_Age; }
set {
if ( value > 0 ) m_Age = value;
}
}
public Animal( string name, int age ) {
this.Name = name;
this.Age = age;
}
public void Talk( ) {
Console.WriteLine( "ワタシハ{0}。年は{1}だよ。",
this.m_Name, this.m_Age );
}
}
みんな、前回のAnimalクラスの定義と何処が違うか分かったかな?public abstract class Animalの所のabstractキーワードが増えているピヨ。 このキーワードをつけることによりインスタンス化を禁止できるんだ。 じゃあ早速試そう。
抽象クラスまたはインターフェイス 'Animal' のインスタンスを作成できません。
ってC#コンパイラに怒られるよね。これでいいんだ。
このインスタンス化できないクラスの事を抽象クラス と呼ぶピヨ。
勘のいい人は気付いているとおもうけど、もちろん抽象化クラスはその他の利点も持っているピヨ。
それは、ヒ・ミ・ツ。というのは冗談で、多態性の時あわせて説明するピヨ。楽しみに待っててね。