デルファイの開発者はすべて、デルファイの開発者がFactory pattern(delphi.about.comはexample in "regular" Delphiです)を使用していますが、仮想作成コンストラクタを使用して実装されていることはごくわずかです。
ので:
仮想コンストラクタが仮想メソッドのようなクラスにあること:-)上でいくつかの光を当てるための時間は、オブジェクトインスタンスのようなものです。
ファクトリパターンの考え方は、実際の作成から作成するもの(この場合は「オブジェクトインスタンス」)の種類(この場合「クラス」)を決定するロジックを切り離すことです。任意の降順クラスで上書きすることができ
TComponentのはとてもvirtual Create constructorがあり、::例えば
type
TComponent = class(TPersistent, ...)
constructor Create(AOwner: TComponent); virtual;
...
end;
TDirectoryListBox.Create constructor上書きそれ:
type
TDirectoryListBox = class(...)
constructor Create(AOwner: TComponent); override;
...
end;
それは仮想作成コンストラクタを使用して、このように動作します
クラス参照(オブジェクトインスタンス参照と同様のクラス)を 'class'型の変数に格納することができますタイプ'。コンポーネントクラスについては、事前に定義されたタイプTComponentClass in the Classes unitがあります:
type
TComponentClass = class of TComponent;
あなたがタイプTComponentClassの変数(またはパラメータ)を持っている場合、あなたは工場出荷時のパターンと非常によく似ている多型の構造、行うことができます。
を
var
ClassToCreate: TComponentClass;
...
procedure SomeMethodInSomeUnit;
begin
ClassToCreate := TButton;
end;
...
procedure AnotherMethodInAnotherUnit;
var
CreatedComponent: TComponent;
begin
CreatedComponent := ClassToCreate.Create(Application);
...
end;
デルファイRTLがここインスタンスのためにこれを使用しています。
Result := TComponentClass(FindClass(ReadStr)).Create(nil);
、ここで:
// create another instance of this kind of grid
SubGrid := TCustomDBGrid(TComponentClass(Self.ClassType).Create(Self));
DFMファイルから読み込まれているフォーム、データモジュール、フレーム、コンポーネントの作成プロセス全体がどのように機能するかが、Delphi RTLの最初の使用方法です。
フォーム(datamodule/frame/...)クラスは実際に(datamodule/frame/...)のフォームにあるコンポーネントの(公開された)リストを持っています。このリストには、各コンポーネントのインスタンス名とクラス参照が含まれています。コンポーネントのインスタンス名程度
- 発見、
- をその後、動的に作成するために、クラス参照を使用しています
- 、基本となるクラスの参照を見つけるために、その名前を使用しています。そして、DelphiのRTLをDFMファイルを読むこと 正しいオブジェクト
一般的なDelphiの開発者は、通常そのようなことは起こりませんが、それがなければDelphiのRADの経験は存在しません。
Allen Bauer(エンバカデロのチーフサイエンティスト)は、blogarticle about this topicとも書いています。 についてのSOの質問もあります。
私は頻繁に以下のパターンを使用しています
--jeroen
これはコミュニティウィキの質問になるはずです –
私はなぜそれを聞くことができますか?私は具体的な質問をしています。Delphiのデザインパターンや、Delphiの言語の変更から変更されているかどうか(012、2009、2010) –
Juraj、特定の質問はしていません。私は少なくとも* 3つの質問を数えますが、どちらもオープンエンドです。しかし、それがコミュニティのwikiを作る根拠かどうかは分かりません。 –