隠蔽-カプセル化
必要な所以外、見えなくする事。クラス内で処理を完結する事。
public フィールドに自由にアクセスされるのでは無く、明示的に処理をかまして情報を取得、公開を行います。これがルールです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
class SetMaker { public string 変数;//<-外部から見えるフィールドをC#で使わない・・・「隠蔽する」、「カプセル化」という。 //カプセル化(隠蔽化)するとはクラス内のフィールドをprivateで宣言することで //外部からの値の参や変更ができないようにする事。 //・・・privateフィールドをゲッター、セッターやpublic関数を通じて間接的にアクセスさせる。 //外的な要因をこのクラス内での事象に収める。・・・と言う考え方。 private string _メーカー;//プロパティ定義を利用して外部と間接的に入出力を行う public string メーカー//プロパティの定義 { get//外部へ値を公開する場合 { //プロパティ取得時に実行する処理(省略可) return _メーカー; } set//外部から値が設定される場合 { //プロパティ設定時に実行する処理(省略可) _メーカー = value; if (value == "") { System.Windows.Forms.MessageBox.Show("名前を入れて下さい", "確認"); _メーカー = "????"; } } } //特に入出力チェックなど行わない場合は下記の様に記述できる public string Name { get; set; }//自動実装と言う //読み取り専用にする場合 public string 選択 { get; private set; } //ゲッターセッターを使用するより、任意のpublic関数を作った方が馴染みます。 //慣れたら普通に使えるのでしょう。 public SetMaker(string メーカー) { this.メーカー = メーカー; Console.WriteLine(メーカー); } public void 出力() { メーカー = メーカー + "選択されました"; Console.WriteLine(メーカー.ToString()); } } |
privateフィールドに上記プログラムではプロパティ(ゲッターセッター)を利用してます。
1 2 3 4 5 6 7 8 9 10 11 |
class Useオブジェクト { public Useオブジェクト() { var use = new SetMaker("");//① use.メーカー = "Sony";//② // use.選択 = "aaa"; readonlyの為ダメ Console.WriteLine(use.メーカー.ToString()); use.出力();//出力 } } |
①、②に設定時チェックされ、””時にポップアップ画面が表示されます。
public string メーカー;として外部からメーカー名を取得、公開したら簡単なのですが、(このプログラムでは簡単過ぎます)外的な要因がプログラムに与える影響が大きい時に、その度に仕様変更が生まれ、連携する他のオブジェクトにも影響が出かねません。オブジェクトの仕様範囲を決める為にもこの様にする様です。
プロパティ以外、publicメソッド経由でprivate変数にアクセスしても良いです。
public一文で済む所を最低でもpublic string Name { get; set; }の様に/自動実装を行う・・・慣れですね。