カプセル化
オブジェクトの情報を隠蔽することによって、不整合を引き起こすような操作をできなくされる仕組み。
カプセル化のイメージ
元々の意味は、オブジェクトやデータをカプセルのように保護するということらしい。
カプセル化のメリット
・オブジェクトのデータが外からチョア苦節変更されることを禁止
・アクセス指定子によってカプセル化するかしないか決められる
・カプセル化されているデータはクラス内の関数によって変更できる
そもそもカプセル化の狙いは・・・「データの保護」
※データの変更をオブジェクト自身に任せることによって、バグ(不整合)を引きお起こさせないようにする。
継承
あるクラスを引継ぎ、新たなクラスを作成できる機能。
※一度使ったオブジェクトの要素と操作を引き継げること
ポリモーフィズム(多態性)
(ポリ(多くの)、モーフィズム(変化))⇒直訳で多くの変化が可能になる⇒多様性
モノがそのモノらしく振舞うこと
例:
?は「??」と鳴く。
(犬、猫、カラスがいたとします)
この3匹はどのように鳴くでしょう?
・犬は「わん」
・猫は「にゃー」
・カラスは「カー」
と鳴く。
これをプログラミングに置き換えると・・・
クラス 犬 {鳴く(){ "わん" }};
クラス 猫 {鳴く(){ "にゃー" }};
クラス カラス {鳴く(){ "かー" }};
それぞれの鳴き声をこのように表してみた。
そして上にある「?は??と鳴く」という風に表すための関数に直す
犬.鳴く();
猫.鳴く();
カラス.鳴く();
と書くことが出来る筈。
それを・・・実行すると
犬.鳴く()⇒”わん”
猫.鳴く()⇒”にゃー”
カラス.鳴く()⇒”かー”
と実行されるはず・・・
その際にポリモーフィズムを利用した書き方
動物 = { 犬,猫,カラス};
for (動物) { 動物.鳴く(); }
かな。
動物に犬、猫、カラスが入って、鳴き声という関数を呼ぶ。
ここで、考えるにあたって、どの動物に対しても鳴くという処理が
同じ動作しかできないのであれば、この構文は使えないということ。
その為、「中に入るものによって同じ関数でも違う処理を行える」
という特徴があるそういう多様性が求められる。
ポリモーフィズムのメリット
・コードがきれいになる(場合によっては記述量が減る)
・プログラムの変更に強くなる柔軟性
クラス
オブジェクトを作るための設計図のようなもの。
インスタンス:設計図に求められた実体
インターフェース(何かと何かの間をつなぐ部分)
アプリを使うときの操作画面は、アプリと人を繋ぐ部分なので「ユーザーインターフェース」と呼ばれている。
なので、何かと何かの橋渡しをしてくれる仲介役と理解しよう。
インターフェースでは実装が良く書かれている・・・「機能とかを新しく追加する」でOK!!
・インターフェースを使えばメソッドの実装を強制できる!!
C#でのインターフェースは「クラスを作った人」と「そのクラスを使う人」の間で、使い方の
約束事を決めることができる仕組みの事を言います。
では、抽象クラスとの違い
「抽象クラス」は「抽象メソッド」を1つ以上含むクラスです。
そして、「抽象メソッド」は継承先でのオーバーライドを強制する仕組み。
インターフェースの作り方のルール
・名前の先頭に「I」をつける
・メソッドの中身は何も書いてはいけない。
※返り血の型や、引数は指定しても大丈夫。
メンバ変数
クラスの中で宣言されている変数
メンバ関数
メンバ変数と同様クラスの中で宣言されるメソッド。
コンストラクタ
初期化を行う為の関数またはメソッドの事。
・コンストラクタ名はクラス名と同じにする必要がある。
・コンストラクタに引数を渡すときは、インスタンスを生成する際に値を指定。
静的クラス(static)
インスタンス化できないクラスで、静的メンバーのみを含めることができる。
部分クラス(partial)
1つのクラス定義を複数個所に分けて記述できる仕組み。
クラス定義の一部を自動生成する場合などに、自動生成部分をpartialで分離
することにより、自動生成を再実行しやすくするといった使い方。
ジェネリクス型の型パラメーター
型パラメーターを利用することで、クラスを定義する際にプレースホルダー型を提供し、
そのクラスを利用する際位に実際の型を指定できる。
汎用的に使えるクラス・インターフェース・メソッ度などを定義できるのでジェネリクスと呼ばれ
基本クラスライブラリでもListkるあすなど主にコレクションで多用されている。
型パラメーターはwhereキーワードで制約を課すことが出来る。classもしくはstructで参照型もしくは
構造体である成約を課したり、指定したクラスを継承したクラスという制約を課したりできる。
また、new()制約により「publicな引数なしのコンストラクターを持つ」という制約を課すことで、
型パラメーターに指定したクラスをコンストラクターで呼び出しでインスタンス化することもできる。