FizzBuzz>それLINQで>それワンライナーで
FizzBuzz>それyield returnで
FizzBuzz>それDecoratorパターンで
の続き。
よく考えたら逆順にぶっこむ必要がなかったので、改訂版を。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
// FizzBuzzのもと
public abstract class FizzBuzzBase
{
// 中の人
public FizzBuzzBase FizzBuzz { get; private set; }
// しゃべる言葉
public abstract string Word { get; }
// 中の人をセット
public FizzBuzzBase(FizzBuzzBase fizzbuzz)
{
this.FizzBuzz = fizzbuzz;
}
// しゃべれ
public void Speak()
{
// 中の人にしゃべらせる
if (this.FizzBuzz != null)
{
this.FizzBuzz.Speak();
}
// 自分がしゃべる
Console.WriteLine(Word);
}
}
// Fizz
public class Fizz : FizzBuzzBase
{
public Fizz(FizzBuzzBase fizzbuzz)
: base(fizzbuzz)
{
}
public override string Word
{
get { return "Fizz"; }
}
}
// Buzz
public class Buzz : FizzBuzzBase
{
public Buzz(FizzBuzzBase fizzbuzz)
: base(fizzbuzz)
{
}
public override string Word
{
get { return "Buzz"; }
}
}
// FizzBuzz
public class FizzBuzz : FizzBuzzBase
{
public FizzBuzz(FizzBuzzBase fizzbuzz)
: base(fizzbuzz)
{
}
public override string Word
{
get { return "FizzBuzz"; }
}
}
// 数字
public class Number : FizzBuzzBase
{
private int number;
public Number(int number, FizzBuzzBase fizzbuzz)
: base(fizzbuzz)
{
this.number = number;
}
public override string Word
{
get { return this.number.ToString(); }
}
}
// メイン
class Program
{
static void Main(string[] args)
{
FizzBuzzBase fizzbuzz = null;
foreach (int i in Enumerable.Range(1, 20))
{
if (i % 3 == 0 && i % 5 == 0)
{
fizzbuzz = new FizzBuzz(fizzbuzz);
}
else if (i % 3 == 0)
{
fizzbuzz = new Fizz(fizzbuzz);
}
else if (i % 5 == 0)
{
fizzbuzz = new Buzz(fizzbuzz);
}
else
{
fizzbuzz = new Number(i, fizzbuzz);
}
}
// しゃべれ
fizzbuzz.Speak();
}
}
}
違うのはFizzBuzzBaseクラスのSpeakメソッドの中身。
中の人にしゃべらせてから、自分がしゃべればいいだけでしたf(^^;
一応実行結果。