次の問題についていくつかの提案をしたいと思います: VCL コントロール用のアダプターを書きたいとしましょう。すべてのアダプタは同じ基本クラスを持つ必要がありますが、特別なコントロールのラッピングが異なります (たとえば、TEdit から値を取得することは、TSpinEdit から値を取得することとは異なります)。したがって、最初のアイデアは、次のようなクラス階層を作成することです
TAdapter = class
end;
TEditAdapter = class (TAdapter)
end;
TSpinEditAdapter = class (TAdapter)
end;
次に、vcl コントロールへの参照を保持するフィールドを導入します。私の特別なアダプターでは、もちろん、具体的なサブクラスで動作します。ただし、基本クラスには参照も含まれている必要があります (たとえば、アダプターを使用してコントロールを表示する場合)。
可能性 1 (プロパティ アクセサーでのダウンキャスト):
TAdapter = class
protected
FCtrl : TControl;
end;
TEditAdapter = class (TAdapter)
public
property Control : TEdit read GetControl write Setcontrol;
end;
{...}
function TEditAdapter.GetControl : TEdit;
begin
Result := FCtrl as TEdit;
end;
したがって、特定のメソッドを実装する場合は Control プロパティを使用し、基本クラスで何かを行う場合は protected フィールドを使用します。
可能性 2 (ジェネリック基本クラスを使用):
TAdapter = class
end;
TAdapter <T : TControl> = class (TAdapter)
protected
FCtrl : T;
end;
TEditAdapter = class (TAdapter <TEdit>)
end;
どちらのソリューションをご希望ですか? それとも、さらに優れた 3 番目の解決策がありますか?
敬具、
キリスト教徒