<クラスって何?>

いくら、言語の仕様書を読んで言語仕様を理解したところで、何がクラス で何がオブジェクトか?この問題は簡単には理解できません。 あるとき、「クラスとオブジェクトの違いは何か?」という問いに対する 回答として「クラスは抽象的な物で、具体的なものがオブジェクトだ」と いう回答を得て、「じゃあ鳥クラスのオブジェクトがスズメだったりする のか?それで完璧なのか?」と疑問を抱いている人がいました。 答えは、完璧ではないが場合によって正しいです。余計に訳が分からなく なりましたか?順を追って考えてみましょう。 例えば、アプリケーションターゲットが鳥類図鑑だとします。 だとしたら、その中に「鳥」というクラスが存在するのは自然ですね。 「鳥」クラスのメンバとしては「名前」「大きさ」「生息区域」... など様々なものが考えられますが、どこまで含めるかは図鑑の情報の詳し さによって変わってきます。 「鳥類図鑑に載っているものは何ですか?」 「スズメ」「ハト」「ツバメ」などです。 と言ってしまうと鳥類図鑑の一部のデータに着目しているのみです。 だから、これはクラスではありません。 しかし、 「鳥」です。 というと、将来、新種の鳥が出てこようと絶滅種が表れようと問題のない 完全な説明です。 これがクラスです。先の「スズメ」「ハト」「ツバメ」などは鳥の具体例 であり、これがオブジェクトです。そして、クラスはオブジェクトを区別 できるようなメンバ変数を持つ必要があります。 今回の場合なら、「名前」メンバ変数の値がそのまま「スズメ」「ハト」 「ツバメ」となるのでオブジェクトを区別できるわけです。 今度はアプリケーションターゲットを変えてみましょう。 「鳥を育てるシュミレーションゲーム」 前回は「スズメ」は鳥クラスのオブジェクトでしたが、シュミレーション ゲームでは「スズメ」はオブジェクトにはなりません。なぜなら、同じ「 スズメ」でも育て方により全く違った鳥になるからです。 つまり、今回のオブジェクトは「スズメ」ではなく、 「スズメA」「スズメB」「スズメC」.... という具体的な1匹のスズメになります。 そして「スズメ」はクラスになるわけです。 では、「鳥」と「スズメ」の関係は?答えは簡単です。 「スズメ」クラスは「鳥」クラスの派生クラスになります。 上記の「ハト」「ツバメ」なども同様に、「鳥」クラスの派生クラスにな ります。 こうして、シュミレーションゲームでは、いろんな種類の鳥を、いっぺん にたくさん飼うことができるわけです。 ------------------------------------------------------------------- <補足> 最後に派生クラスの実用上の意味と利点を簡単に話しておきます。 鳥 +- スズメ +- ハト +- ツバメ という継承関係があったとき、シュミレーションゲームの実装コードは、 どこに書きますか?いろんな意見があると思いますし、多少のプログラミ ング経験のある方なら、自身の意見どおりのコーディングを行うこともで きるでしょう。 でも、オブジェクト型設計として理想的なのは1つです。ほとんどのコー ドを「鳥」クラスに書くことです。 シュミレーションゲーム上での「スズメ」「ハト」「ツバメ」の違いは何 ですか?大部分は形状や成長パラメータの差でしかないと思います。 (形状データは違ってもデータにしたがって形状を描画する処理は同じ、 成長パラメータは違っても成長に伴う内部処理はほとんど同じ) だから、シュミレーションゲームの処理自体は「鳥」クラスに実装すれば よいのです。 こうすることにより、「スズメ」「ハト」「ツバメ」クラス間でコードの 共通化を図ることができます。コードの共通化には 1.仕様変更に対して、修正個所を最小限に抑える 2.同様に不具合発生時の修正個所を最小限に抑える 3.不具合そのものが全てのクラスで同時に発生する可能性が高く 不具合が発見されやすい などの利点(2.3.の連携は不具合の早出し&即修正という非常に大きな メリットを持っています)があります。 では、派生クラスにコーディングすべきときはどういうときでしょう? 例えばハトを育てる場合に限り「伝書バト」という育て方を楽しむことが できるとします。「伝書バト」はハト特有の育て方ですので、「スズメ」 「ツバメ」には関係の無いことです。よって「伝書バト」に関するコーデ ィングは「ハト」クラスに行うことになります。 -------------------------------------------------------------------