クラスについて

いままでの解説でもちょくちょくクラスという名前が出てきたかと思います。
ここから数ページにわたってクラスの解説を行います。

クラスの機能は非常に多いので、すべてを理解する必要はありません。
クラスの基本的な機能を使用するだけでも、使用しない場合に比べて格段に便利になります。

オブジェクト指向

プログラミングの手法の一つにオブジェクト指向というものがあります。
これは「オブジェクト」つまり「物」を基本単位としてコードを書いていくスタイルのプログラミングです。
これを正確に説明することは難しいのですが、おおむね

  • カプセル化(情報の隠蔽)
  • ポリモーフィズム(多様性)
  • 継承

の三つの要素で説明されます。

カプセル化(情報の隠蔽)

例えば「テレビ」というオブジェクトがあります。
テレビの主な機能は「電波を受信する」「映像を表示する」などです。
テレビに対する操作は「チャンネルを変える」「ボリュームを調整する」などがあります。

このような機能がテレビ内部でどのように実現されているかの知識や情報はユーザーには一切必要ありません。
ユーザーが知らなくても良い情報は見せない、使わせないのがカプセル化(情報の隠蔽)です。

テレビオブジェクトが外部に公開しているのは、テレビをテレビとして使用するのに必要な操作方法だけです。
この操作方法に従う限りはテレビが壊れたりはしません。
そのような操作方法は提供されていないからです。

オブジェクトの独立性

テレビオブジェクトの中にはテレビの機能を実現するのに必要な部品だけが入っています。
テレビにはエアコンの温度調節機能はありません。
必要な機能だけで独立したオブジェクトにする必要があります。

別にテレビにエアコンの温度調整機能があっても困りませんが、そんなものは必要ないという人も多いでしょう。
このような無駄な機能もコストに反映されています。
テレビなら販売価格に含まれていますし、プログラムなら処理速度やメモリ使用量などに影響します。

本当に困るのは、エアコンの温度調節をするのにテレビが必要になる場合です。
つまり、テレビとエアコンとで動作が独立していない状態です。
エアコンを使うためにはテレビもセットで買わねばならなくなります。

テレビとエアコンの機能が混ざることは現実の世界ではあり得ませんが、プログラムの世界ではこのようなことは起こり得ます。
複数の機能が同時に必要になるプログラムで、本来は無関係に動作するはずの機能Aと機能Bを同時に開発しているときに、設計がしっかりしていないと機能Aの動作が機能Bに依存してしまう場合があります。
そのプログラムはとりあえずは問題なく動くでしょうけれど、将来的にバグの修正やバージョンアップなどでコードを修正する際に、非常に保守性が悪くなります。
また、コードの再利用も困難でしょう。

ポリモーフィズム(多様性)

テレビやレコーダーなどの複数のリモコンをひとつにまとめる「マルチリモコン(学習リモコン)」という製品があります。
最近ではスマホアプリにも複数の家電の操作をまとめてしまうリモコンアプリがあります。

このマルチリモコンは、同じ操作でも違う結果を発生させることができます。
例えばテレビに向かって電源オフの操作をすればテレビの電源が切れます。
レコーダーに向かって電源オフの操作をすればレコーダーの電源が切れます。

当たり前のことに思えますが、押すスイッチは同じでも違う結果が発生するということは、必要に応じて機能を切り替えている(違う命令を送っている)ということです。
これがポリモーフィズムです。

これは言い換えればコードの抽象度を上げることができます。
「テレビの電源をオフにする命令」は具体的な命令ですが、具体的であるのでテレビの電源を切る以外には使用できません。
「何らかのオブジェクトの電源をオフにする命令」は、あらゆる家電の電源をオフにすることができます。
この「何らかのオブジェクト」という抽象的な部分に、後からテレビやレコーダーなどの具体的なオブジェクトを当てはめることができます。

「テレビの電源を切る命令」と「レコーダーの電源を切る命令」の内容は異なるので、そこはそれぞれの具体的な命令(コード)を書く必要はありますが、その命令を使う側は操作対象の違いを気にすることなく同じ操作をするだけで良い(抽象的な命令で動く)ので、扱いが簡単になります。

継承

以前開発したテレビよりも高機能なテレビを開発するとします。
またゼロから開発するのは効率が悪いので、以前のテレビを改良して新機能を追加するのが良いでしょう。

このように、ある機能を引き継ぎ、必要に応じて機能を追加変更して新しいものを作るのが継承です。

「過去に開発したプログラムの再利用」と説明されることもありますが、実際には再利用の場合に継承を利用することはあまりないかもしれません。
どちらかというと継承を前提としたプログラムの「部品」をあらかじめ作っておき、使用する場所に応じて適宜機能を追加して利用する、というほうが実際のイメージに近いです。
例えばリモコンのボタンの機械構造(物理的な構造)自体はどの製品でも大差はないことが多いので、共通化できる「部品」とみなすことができます。
その部品の基本的な構造はそのまま利用(継承)して、形や大きさ、材質などを適宜変更し、必要に応じてLEDで光らせるなどの機能を追加することで開発効率をアップさせることができます。

クラスとは

上記のような機能をプログラミングで実現するために使用されるのがクラスです。
これらの要素はクラスに固有のものというわけではありませんが、C#のクラス機能ではすべて実現できます。

オブジェクト指向は現実の「物作り」と同じようなものです。
ある機能を実現するために必要なデータ(変数や関数など)をまとめてひとつの「オブジェクト」と考え、それを作ることがメインとなるプログラミングスタイルです。
複数の「オブジェクト」を連携させてひとつのソフトウェアを作ります。