
|
|
|
もくじ ・ 前のページ ・ 次のページ
2.クラス参照型とクラス型
私が初めて Object Pascal 言語リファレンスを読んだ時、最も理解出来なかったモノのひとつが、このクラス参照でした。正確には「クラス参照型」です。 「クラスを指定する型」ということなのですが、敢えて言えば、上記「工場」を指定する「型」です。型ですから、その型の「変数」を利用することが出来ますので、『クラス参照型変数には、「工場」を代入する』ことが出来ます。「クラスへの参照を代入する」というようにマニュアルには記述されていると思いますが、実体ではないクラスを変数に代入することが出来るという概念が、当時の私には難しかったようです。
対して「クラス型」はクラスの実体を扱う型です。「工場で生成されたモノ」を代入します。「工場」を代入することは出来ません。
type TEditorClass = class of TEditor; // クラス参照型 TEditorEx = class(TEditor); // TEditor 拡張クラス var EditorClass: TEditorClass; // クラス参照型変数 Editor: TEditor; // クラス型変数 begin EditorClass := TEditorEx; // 工場を代入 Editor := EditorClass.Create(Application);
//////////////////////////////////////////////////////////////////////// 出荷時の Delphi は、TEditor も、皆さんが作成されたコンポーネントも知ら ないハズですが、該当コンポをインストールすることで、設計時にちゃんと生成 してくれます。これは、コンポのインストール作業が「Delphi に工場をインス トールする」ことを意味します。Delphi には、クラスの名前と工場を結びつけ るテーブルが用意されていて、フォームを開くときには、.dfm ファイルからク ラスの名前を読み込んで該当工場を検索しその工場に生成してもらうという仕組 みになっています。インストールしていないコンポが貼り付けられたフォームを 開こうとするとエラーが発生するのはこのためです。 ////////////////////////////////////////////////////////////////////////
さて、クラス参照型変数には、クラス型と同様、型宣言された時に指定されたクラスの下位クラスを代入することが出来ます。TEditor 内部でパーサーを利用している部分では、
var Parser: TFountainParser; Parser := ActiveFountain.ParserClass.Create(ActiveFountain);
というコーディングが行われています。これは、現在利用されている Fountain コンポーネントが指定するパーサーの工場にパーサーを作らせています。
変数 Parser は TFountainParser とその下位クラスのインスタンスを代入出来る変数ですから、皆さんが作成される TFountainParser の拡張クラスのインスタンスをすべて受け入れることが出来ます。
TFountain クラスの ParserClass プロパティは、クラス参照型である TFountainParserClass 型の読みとり専用プロパティで、問い合わせに対して、クラスをつまり工場を返して来ます。この工場は、TFountainParser クラスの下位クラスでなければなりません。これは、Delphi にインストールするコンポーネントが TComponent の下位クラスでなければならないのと同じです。逆に言えば、Delphi は、TComponent の下位クラスであればどんなクラスでもそのインスタンスを生成することが出来るということです。同様に TEditor は、将来皆さんが作成される TFountainParser の下位クラスのインスタンスを生成して利用することが出来るのです。
クラス参照万歳!
もくじ ・ 前のページ ・ 次のページ
|
|