.NET Visual C#言語入門 > クラスとオブジェクト
のぶ亭『プログラミングの相談窓口』 … 様々なプログラミング問題を個別対応致します |
クラスとオブジェクト
オブジェクト指向:クラスとオブジェクト
オブジェクト指向のオブジェクトの概念を解説するのは非常に難しいです。よくモノにたとえる解説を見ますが、オブジェクト=モノとすると初心者は誤解するでしょう。オブジェクトの訳は、「対象。客観。客体。」となっていますから、オブジェクト=対象と理解した方がいいですね。
オブジェクトとクラスもよく誤解される用語です。クラスはメンバー(メソッド、プロパティ・・・)を定義したもので、これ自体では何も実行されません。実行するためにはオブジェクトとしてクラスをインスタンス(実態)化します。この状態をオブジェクトと呼びます。
例えば、整数型の宣言は以下の通りです。
(C#の場合) int Count = 0; (VBの場合) Dim Count As Integer = 0
整数型(int or Integer)をクラスと想定すると次のようなコードになります。
(C#の場合) int Count = new int(); Count = 0; (VBの場合) Dim Count As Integer = New Integer Count = 0
整数型(int or Integer)のクラスをインスタンス(実態)化し、Countという変数にオブジェクトが代入されます(オブジェクトは、実体化されたクラスへのエントリーポイント(入り口)というメモリ上のアドレスを指します)。コード上どちらも同じ動きになります。
整数型(int or Integer)などは、文法で規定されている型として”組込型”とよばれます。クラスはオブジェクト型に分類されますが、”オリジナルに定義した型”と考え ることができます。そして、オブジェクトを操作するために、プロパティやメソッドを呼び出すと考えます。
クラスの構成
クラスは、メンバー(フィールド、メソッド、プロパティ、イベント)で構成されます。
内部的には、フィールドを中心にメソッドおよびプロパティで構成されます。また、関連する他のオブジェクトの非同期駆動のメソッドとしてイベントという概念もあります。
メソッド、プロパティは、プログラムとして実行する最小の単位です。
メンバーは、公開と非公開に分けることができます。
プログラムの実行
プログラムを実行すると、必ず最初に起動されるエントリーポイントという概念があります。C#ではMain()メソッド、VB Sub Main()がそれに該当します。
プログラムは、Mainの中に書き、Mainの外部および内部にオブジェクトを作成し、それぞれのオブジェクトを操作します。
使う側と作る側の視点
大原則として、オブジェクトを使う側から見れば、目的とそれに対する機能やサービスなどが明確であればいいのです。実装面から言えば、継承関係を活用する場合もありますが、何れにしても使う側の利便性を重視すれば、見通しの良いプログラム・コードを書くことができます。
使う側とのインターフェイス
- プロパティ
フィールドと同じように取得と設定ができます。オブジェクトの属性を決定する概念です。 - メソッド
オブジェクトの操作を行います。 - イベント
オブジェクト内で事象が発生したとき、非同期で通知する機能です。 - フィールド
使う側からは、プロパティとフィールドの違いはわかりません。作る側からの視点で、フィールドは公開しない方が望ましいとされています。
使う側にとって不要な操作を要求してはならない。
クラスの実装
カプセル化
カプセル化とは、関連するプロパティ、メソッド、およびその他のメンバのグループが 1 つの単位またはオブジェクトとして扱われることを意味します。
オブジェクトは、プロパティの変更やメソッドの実行を制御できます。たとえば、プロパティが変更される前に値を確認できます。
データの隠ぺい
カプセル化により、オブジェクトの実装の詳細を隠すことができるため、実装を後で変更するのが簡単になります。これをデータの隠ぺいと呼びます。
継承
継承は、既存のクラスに基づいて新しいクラスを作成する機能です。新しいクラスは、基本クラスのすべてのプロパティ、メソッド、およびイベントを継承します。また、プロパティやメソッドを追加することによってカスタマイズできます。
ポリモーフィズム
ポリモーフィズムは、オブジェクト指向プログラミングには欠かせない特性です。ポリモーフィズムによって、その時点で使用されているオブジェクトの型に関係なく、同じ名前の項目を使用できるようになります。
オーバーロード、オーバーライド、シャドウの概念
これらは、似ているためにしばしば混同されます。これら3つともすべて同じ名前のメンバを作成するための方法ですが、それぞれ重要な違いがあります。
オーバーロード
オーバーロードされたメンバを使うと、同じ名前を持つプロパティまたはメソッドの別のバージョンを提供できます。ただし、名前は同じでも、パラメータの数またはパラメータのデータ型は異なっている必要があります。
同じメソッド名で引数(パラメータ)が異なる場合、複数のメソッドを実装できる
オーバーライド
オーバーライドされたプロパティやメソッドを使うと、継承したプロパティやメソッドを派生クラスで置き換えることができます。オーバーライドされたメンバの引数のデータ型と数は同じである必要があります。派生クラスは、オーバーライドされたメンバを継承します。
継承元のプロパティやメソッドを継承先で置き換える
シャドウ
シャドウされたメンバは、ローカルな範囲内で、より広いスコープを持つメンバの代わりに使用されます。シャドウの対象となる型に制約はありません。たとえば、継承した同じ名前のメソッドをシャドウするプロパティを宣言できます。シャドウされたメンバは継承できません。
オブジェクト指向的なコード・非オブジェクト思考的なコード
オブジェクト思考的な発想でプログラムを描く
- プログラムはオブジェクトの連鎖
- オブジェクトは対象が明確であり、機能やサービスを提供する
- オブジェクトにオブジェクトを渡す
- オブジェクトからオブジェクトをもらう
- オブジェクトはできるだけ手順を排除する。必要なら明記する
- プログラム的には、オブジェクトは一つのオリジナルな型
- オブジェクトには、データ管理、計算処理などのモノ以外の概念がある
内部のメカニズムを不用意に外部に漏らしたり、何らかの強制を行ってはならない。
使う側にとって不要な操作を要求してはならない。
オブジェクト思考的なコード以外は、すべて非オブジェクト思考的なコードとなる。
オブジェクト
オブジェクトは、データ、動作、および ID が割り当てられたプログラミング構成要素です。オブジェクトのデータは、オブジェクトのフィールド、プロパティ、およびイベントに格納され、オブジェクトの動作は、オブジェクトのメソッドとインターフェイスによって定義されます。
オブジェクトには ID があります。2 つのオブジェクトが同じデータ セットを持っていても、それらが同じオブジェクトであるとは限りません。
C# のオブジェクトは、classes および structs によって定義されます。これらは、同じ型のすべてのオブジェクトの動作の基礎となる単一の設計図となります。
オブジェクトの概要
- C# で使用するものは、Windows フォームやコントロールを含め、すべてオブジェクトです。
- オブジェクトはインスタンス化されます。つまり、クラスと構造体で定義されたテンプレートから作成されます。
- オブジェクトでは プロパティを使用して、格納する情報を取得および変更します。
- オブジェクトには、多くの場合、メソッドやイベントがあり、それらによって特定のアクションを実行できます。
- C# オブジェクトはすべて Object から継承されます。