クラスについて

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

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

オブジェクト指向

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

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

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

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

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

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

オブジェクトに対する操作方法が限定されているのもカプセル化の重要な要素です。
ユーザーが間違った操作をしてもテレビは壊れたりしません。
テレビが壊れるような操作はユーザーに提供していないからです。
ユーザーは、設計者が意図した操作のみを実行可能です。

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

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

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

設計がしっかりしていないとこのような事態は本当に起こり得ます。
テレビとエアコンとが同時に存在するようなプログラムを作っている時に、何も考えずに作るとそうなるおそれがあります。
そのプログラムはとりあえずは問題なく動くでしょうけれど、将来的にバグの修正やバージョンアップなどでコードを修正する際に、非常に保守性が悪くなります。
また、コードの再利用も困難でしょう。

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

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

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

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

継承

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

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

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

クラスとは

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

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