オブジェクト指向におけるFizzBuzz問題
http://blogs.wankuma.com/episteme/archive/2007/11/08/106927.aspx
(東方算程譚 より)
【問題】
class Program {
public static void Main() {
Animal animal;
animal = new Dog();
animal.Sound();
animal.SetCount(3);
animal.Sound();
animal = new Cat();
animal.Sound();
}
}
上記のプログラムを実行した結果が
わん
わんわんわん
にゃー
となるように Animal, Cat, Dog を実装しなさい。
解いてみました
abstract class Animal {
private int count;
private string soundText;
public Animal(string soundText) {
this.count = 1;
this.soundText = soundText;
}
public void SetCount(int value) { this.count = value; }
public void Sound() {
for(var i = 0; i < this.count; ++i) Console.Write(this.soundText);
Console.Write("\r\n");
}
}
class Dog : Animal { public Dog() : base("わん") {} }
class Cat : Animal { public Cat() : base("にゃー") {} }
class Pig : Animal { public Pig() : base("ぶー") {} }
何も考えず素直に書いたコードなんですけど・・・^^;
以下、見苦しい言い訳です^^;
オブジェクト指向プログラミングにおいても、どんなソフトウェアを作るのかによって、そのオブジェクトに欲せられる振る舞いが変わる気がします。
問題のソフトウェアの要件はわかりませんが、少なくとも各種動物の鳴き声を指定回数分だけ1行に表示するために動物というクラスが、ソフトウェア内部に用意されたのでしょう。
ですから、このクラスにとって鳴き声は重要ですからコンストラクタで定義すべきだと思いました。
鳴き声の無い動物が将来的に追加されることもあるかもしれませんが、先に述べた理由によって、明示的に String.Empty を与えるべきだと思います。
これによって、Main 側で鳴き声を定義する前に Sound() メソッドが実行されることはありません。
以上、言い訳でした。
#ぶーは余計でしたね。
#さらに、ひろえむさんのご指摘で abstract を追加しますた。動物は抽象的なものですからね。