まさるblog

越後在住子持ちプログラマー奮闘記 - Author:まさる(高野 将、TAKANO Sho)

目次

Blog 利用状況

ニュース

著書

2010/7発売


Web掲載記事

@IT

.NET開発を始めるVB6プログラマーが知るべき9のこと

CodeZine

実例で学ぶASP.NET Webフォーム業務アプリケーション開発のポイント

第1回 3層データバインドを正しく活用しよう(前編)

ブログパーツ


書庫

日記カテゴリ

コミュニティ

FizzBuzz>それDecoratorパターンで(改)

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(^^;

 

一応実行結果。

image

投稿日時 : 2009年10月12日 8:15

Feedback

# 無意味に難解なFizzBuzz 2009/10/12 9:06 東方算程譚

無意味に難解なFizzBuzz

# GNslQiVHOEUUR 2011/12/27 18:46 http://www.hooksandlattice.com

Hello! Read the pages not for the first day. Yes, the connection speed is not good. How can I subscribe? I would like to read you in the future!...

タイトル
名前
Url
コメント