#12 カプセル化
カプセル化というのは,不要な情報を隠すという考え方で,プログラミングに限らず,様々な分野においても重要です.まずは現実の世界でのカプセル化を説明しましょう.
##現実の世界でのカプセル化
現実の世界では様々なモノがカプセル化されています.例えば,電子機器などは内部の状態(回路やプログラムなど)を知らなくてもボタン一つで動かすことができるものが多いです.逆に,回路が丸出しで,ボタンの代わりに利用者が回路を自分で繋ぎ直したり,プログラムを書き直したりするような電子機器があれば,利用者はそれを使うために専門的な知識を身に着ける必要が出てきます.
また,ボタンで簡単に扱える電子機器を作ったとしても,デバッグ用のボタンなど,利用者が使う必要のない余計な機能などがあると,利用者は混乱するでしょう.そうならないためにもカプセル化というものが必要になってきます.
##プログラムでのカプセル化
class VendingMachine
{
private int waterStock;
private int coffeeStock;
private int teaStock;
private int juiceStock;
public VendingMachine()
{
waterStock = 15;
coffeeStock = 10;
teaStock = 10;
juiceStock = 10;
}
public void DisplayStatus()
{
Console.WriteLine("Water" + (waterStock == 0 ? " sold out" : string.Empty));
Console.WriteLine("Coffee" + (coffeeStock == 0 ? " sold out" : string.Empty));
Console.WriteLine("Tea" + (teaStock == 0 ? " sold out" : string.Empty));
Console.WriteLine("Juice" + (juiceStock == 0 ? " sold out" : string.Empty));
}
public void GetDrink(string drink)
{
switch (drink)
{
case "Water":
if (waterStock == 0) return;
Console.WriteLine("You got water.");
waterStock--;
break;
case "Coffee":
if (coffeeStock == 0) return;
Console.WriteLine("You got coffee.");
coffeeStock--;
break;
case "Tea":
if (teaStock == 0) return;
Console.WriteLine("You got tea.");
teaStock--;
break;
case "Juice":
if (juiceStock == 0) return;
Console.WriteLine("You got juice.");
juiceStock--;
break;
default:
Console.WriteLine("Error.");
break;
}
}
}
自動販売機のようなものを作ってみました.利用者が残りの個数を気にする必要はないので,売り切れているかどうかだけを知ることができる仕様です.
さらに,利用者が補充することがないようにメンバ変数にはprivate
(クラス外からアクセス不可)修飾子が付いています.
##アクセス修飾子
C#で使えるアクセス修飾子は以下の4つです.
修飾子 | 詳細 |
---|---|
public | クラス外部からもアクセス可 |
internal | 同じアセンブリ内のクラス外部からはアクセス可 |
protected | 派生クラスを除くクラス外部からのアクセス不可 |
private | クラス外部からはアクセス不可 |
また,internal とprotected はinternal protected のように併用することが可能です. |
次回はオブジェクト指向のまとめをします.
すみません.まとめたら大した内容にならなかったためやめました.
次はGenericsとか関数型とかやろうと思います.