## 2014年6月8日日曜日

### C# - 継承: オブジェクトの系図(共有コードを含むベースクラスを作成する)

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;
}
}
}
```