オブジェクト指向におけるFizzBuzz問題

http://blogs.wankuma.com/episteme/archive/2007/11/08/106927.aspx

これのPHP(5.2系)での問題と模範解答を挙げてください。
移植に留まらない問題の変更もOKです。

回答の条件
  • 1人1回まで
  • 登録:2007/11/08 23:29:47
  • 終了:2007/11/15 23:30:03

回答(2件)

id:heppokoA No.1

heppokoA回答回数65ベストアンサー獲得回数72007/11/09 00:31:26

ポイント35pt

こんな感じでしょうか。

問題は同じで。

<?php

abstract class Animal
{
    protected $count = 1;
    protected $word = "";
    
    public function Sound()
    {
        print str_repeat($this->word, $this->count)."\n";
    }
    
    public function SetCount($pCount)
    {
        $this->count = (int)$pCount;
    }
}

class Dog extends Animal
{
    public function Dog()
    {
        $this->word = "わん";
    }
}

class Cat extends Animal
{
    public function Cat()
    {
        $this->word = "にゃー";
    }
}

class Program
{
    public static function Main()
    {
        $animal = new Dog();
        $animal->Sound();
        $animal->SetCount(3);
        $animal->Sound();
        $animal = new Cat();
        $animal->Sound();
    }
}

Program::Main();

?>

出力は,

わん
わんわんわん
にゃー

となります。

id:FnuLnu

綺麗な回答ありがとうございます。

個人的にはコンストラクタの書き方について、

まだPHP4スタイルで書くかPHP5スタイルで書くか悩みます。

もう一年も立てば状況も変わるんでしょうが。

str_repeatの存在は初めて知りました。

2007/11/09 03:06:07
id:Aileron No.2

Aileron回答回数3ベストアンサー獲得回数02007/11/12 18:09:12

ポイント35pt

heppokoA さんのコードと似たり寄ったりだけれども。

鳴かない動物にも対応してスモールトーク風味な記述にしてみた。

<?php
abstract class Animal
{
    private $count = 1;

    public function sound()
    {
        for ($i=0;$i<$this->count;$i++)
        {
            $message .= $this->cry();
        }
        print $message."\n";
        return $this;
    }

    public function setCount($count)
    {
        $this->count = (int)$count;
        return $this;
    }

    protected abstract function cry();
}

class Dog extends Animal
{
    protected function cry()
    {
        return "わん";
    }
}

class Cat extends Animal
{
    protected function cry()
    {
        return "にゃー";
    }
}

class NoCryException extends Exception
{

}

class Sloth extends Animal
{
    protected function cry()
    {
        throw new NoCryException();
    }
}

class Main
{
    public static function main()
    {
        $dog = new Dog();
        $dog->sound()->setCount(3)->sound();

        $cat = new Cat();
        $cat->sound();

        $sloth = new Sloth();
        $sloth->sound();
    }
}
Program::main();
?>
|php|<
id:FnuLnu

返り値をオブジェクトにする事でこういう書き方も出来るんですね。

面白いです。

2007/11/13 13:04:22

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません