オブジェクト指向概論

ホームC#入門講座第3章:ものづくり技術論 > オブジェクト指向概論

オブジェクト指向概論

オブジェクトとは?

オブジェクトを最も簡単に定義するならば、「具体的事物としてデータと動作を含むもの」です。

例えば、冷蔵庫。私の冷蔵庫には「銀色」というデータや「小さい」というデータがあると同時に、「冷却する」「停止する」「ドアを開ける」というような動作も含みます。そして、冷蔵庫は具体的事物です。よって、冷蔵庫はオブジェクトです。

また、テレビもそうです。私のテレビには「26インチ」「液晶」というデータがあると同時に、「電源を付ける」「電源を消す」「音を大きくする」というような動作も含みます。そして、テレビは具体的事物です。よって、テレビもオブジェクトです。

クラスとは?

オブジェクトの設計図です。オブジェクトはクラスから作られますが、クラスの状態では機能を果たせません。冷蔵庫の設計図は私の野菜ジュースを冷却できませんし、テレビの設計図は「日曜洋画劇場」を映し出すことはできません。

このような関係から、オブジェクトは具体的でクラスは抽象的であると考えられます。「りんごの定義」と「目の前にある1個のりんご」の違いです。

メンバとは?

クラスは設計図として様々なことを記述しています。それら設計図に記述されたものを「メンバ」と言います。入門講座で紹介するメンバは次の3つです。

フィールドとは?

変数です。ですが特に「フィールド」という場合は、クラス直下に記述された変数を指すことが多いです。

using Systemm;
class Test
{
	private string str = "こんにちは";
	public static void Main(string[] args)
	{
		Console.WriteLine(this.str);
	}
}

これまでのプログラムとは違い、Main()メソッドの外、Testクラスの直下に宣言された変数strは「フィールド」と呼ばれます。

フィールドには「アクセス修飾子」を付けることができ、ここでは private を指定しています。多くの場合、private が使われます。

メソッドとは?

これまでにも何度も使ってきました。「動作」を持つ一連の命令ブロックです。

プロパティとは?

これまでに使ったプロパティはおそらく「DateTime.Nowプロパティ」だけです。プロパティはフィールドを制御する役目を果たします。

例えば、冷蔵庫の「色」を示す color というフィールド(変数)があるとします。そこに "Black" を代入するのは適切ですが、"Block" を代入するのは適切ではありません。プロパティはこのように、フィールドに値を set する際の簡単な処理を担います。

また、値を set するときだけでなく、get することもできます。DateTime.Nowプロパティがその代表的な例で、DateTime.Nowには私たちは時間を set することはできませんが、get することは可能です。このようにフィールドにたいしてより複雑な処理を行う際に非常に強い力を発揮します。

なお、プロパティはメソッドでも代用できますが、SetColor()メソッドやGetColor()メソッドを定義するよりも color フィールドを制御する Color プロパティを定義した方がよりスマートであることは誰の目にも明らかです。

オブジェクト指向の3大概念

オブジェクト指向の特徴的な概念は3つあります。

カプセル化とは隠蔽です。わかりやすく言うと、独立自尊と言えます。クラスという設計図に定義され、そこから生成されたオブジェクトは完全に独立しており、その中のここの機能に対するアクセスはクラスの定義に基づいて制御されます。privateやpublicなどがその例であり、また static は例外です。

継承とはその名のとおりです。「液晶」というクラスをベースにして「液晶テレビ」や「ノートパソコン」というクラスを定義すれば、「液晶テレビ」や「ノートパソコン」というクラスの中で「液晶」に関する機能の実装をする手間が省けます。

ポリモーフィズムとは日本語に直すと「多様(態)性」ですが、いまいち分からないでしょう。具体的な例が、Console.ReadLine()クラスとStreamReader.ReadLine()クラスです。全く別々の処理ですが、「読み取る」という機能は人間にとって同じなので、わかりやすく同じメソッド名を付けています。また、「+」に「加算演算子」と「文字列連結演算子」の役割があるとお話しましたが、それもポリモーフィズムの例です。

まとめ

以上のような特徴を持ったオブジェクト指向を駆使して実際にプログラミングする際の手順を示します。

  1. 目的にあったクラスを記述する。その際はメンバであるフィールド・メソッド・プロパティをクラスの中に定義していく。
  2. クラスを実体化してオブジェクトにする。その際は new という演算子を用いる。
  3. 実体化され、メモリに存在するオブジェクトのメソッドやプロパティを呼び出して使う。その際は「.」ドット演算子(スコープ演算子)を用いる。
  4. オブジェクトを使い終わったらきちんと処分する。ただし、C#では実行環境が自動で処理してくれるので心配不要。

では、次回から、「様々な図形の面積を求めるプログラム」を作ることにして、オブジェクト指向を学んでいきます。