2014年6月8日日曜日

開発環境

Head First C#―頭とからだで覚えるC#の基本 (Andrew Stellman (著)、Jennifer Green (著)、佐藤 嘉一 (監修)、木下 哲也 (翻訳)、オライリージャパン)の5章(継承: オブジェクトの系図)、エクササイズ(p.204)を解いてみる。

エクササイズ(p.204)

コード

Form1.cs

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
    public class Party
    {
        const decimal costOfFoodPerPerson = 2500;

        public int numberOfPeople;
        public decimal costOfDecorations;

        public Party(int numberOfPeople, bool decoration)
        {
            this.numberOfPeople = numberOfPeople;
            CalculateCostOfDecoration(decoration);
        }
        public int NumberOfPeople
        {
            get { return numberOfPeople; }
            set { numberOfPeople = value; }
        }
        public void CalculateCostOfDecoration(bool decoration)
        {
            if (decoration)
            {
                costOfDecorations = 1500M * numberOfPeople + 5000M;
            }
            else
            {
                costOfDecorations = 750M * numberOfPeople + 3000M;
            }
        }
        public virtual decimal CalculateCost()
        {
            return costOfFoodPerPerson * numberOfPeople + costOfDecorations;
        }
    }
    public class DinnerPary : Party
    {
        decimal costOfbeveragesPerPerson;
        bool healthyOption;

        public DinnerPary(int numberOfPeople, bool decoration, bool healthyOption)
            : base(numberOfPeople, decoration)
        {
            this.healthyOption = healthyOption;
            this.costOfbeveragesPerPerson = healthyOption ? 500M : 2000M;
        }
        public override decimal CalculateCost()
        {
            decimal cost = base.CalculateCost() + costOfbeveragesPerPerson * numberOfPeople;
            cost = healthyOption ? cost * 0.95M : cost;
            return cost; ;
        }
    }
    public class BirthdayParty : Party
    {
        int cakeSize;
        string cakeWriging;

        public BirthdayParty(int numberOfPeople, bool decoration, string cakeWriging)
            : base(numberOfPeople, decoration)
        {
            CalculateCakeSize();
            this.cakeWriging = cakeWriging;
        }

        void CalculateCakeSize()
        {
            if (NumberOfPeople <= 4)
            {
                cakeSize = 7;
            }
            else
            {
                cakeSize = 15;
            }
        }

        public string CakeWriging
        {
            get { return this.cakeWriging; }
            set
            {
                int maxLength;
                if (cakeSize == 7)
                {
                    maxLength = 16;
                }
                else
                {
                    maxLength = 40;
                }
                if (value.Length > maxLength)
                {
                    MessageBox.Show(cakeSize + "号のケーキには文字数が多すぎます");
                    if (maxLength > cakeWriging.Length)
                    {
                        maxLength = cakeWriging.Length;
                    }
                    this.cakeWriging = cakeWriging.Substring(0, maxLength);
                }
                else
                {
                    this.cakeWriging = value;
                }
            }
        }
        public override decimal CalculateCost()
        {
            decimal cost = base.CalculateCost() + 25 * cakeWriging.Length;
            if (numberOfPeople > 12) 
            {
                cost += 10000;
            }
            return cost;
        }
    }
}

0 コメント:

コメントを投稿