もくじ前のページ次のページ
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 の下位クラスのインスタンスを生成して利用することが出来るのです。

クラス参照万歳!



もくじ前のページ次のページ


[PR]車のドレスアップ代を稼ぐ:携帯で1日1万円収入も可能です