私は2つの異なるメソッドポインタを持っています。互換メソッドポインタ間のキャスト方法は?
type
TComponentMethod = procedure(const AComponent: TComponent) of object;
TFormMethod = procedure(const AForm: TForm) of object;
唯一の違いは、引数の型であるが、それはビューの呼び出し規約ポイントから任意の違いを作るべきではありませんので、両方がオブジェクト参照です。
(ただし、それが原因でコ/ contravarianceの、型の安全性の問題である可能性があります。)
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
procedure M2(const AForm: TForm);
end;
procedure TForm1.FormCreate(Sender: TObject);
var
FormMethod: TFormMethod;
ComponentMethod: TComponentMethod;
begin
FormMethod := M2;
// How to cast this?
ComponentMethod := M2;
end;
コンパイラが、私はそれを行うことはできません。
[dcc32 Error] Unit1.pas(32): E2010 Incompatible types: 'TComponent' and 'TForm'
メソッドポインタを別の互換性のあるメソッドポインタにキャストする方法はありますか?
これらは絶対的に***互換性がありません***(引用符でさえありません)。 'TForm'メンバを使わずに' M2'を実装した場合(これは非フォームで 'ComponentMethod'を呼び出すと壊れるため)、' TForm'入力を行うための 'M2'を宣言するポイントはありません。 –
これは、はるかに複雑な問題の単純化された例です。私は、メソッドが正しい型(またはいくつかのサブタイプ)で呼び出されることを確認する必要があることを知っています。メソッドポインタのキャストは反変です。 –
これと他のコメントはあなたの質問を[XY問題](http://xyproblem.info/)のように見せてくれます。実際の問題については、型固有のコールバックイベントを使用して解決するためのアイデアが出てきたので、私たちに語ったことはありません。一般的に格納されます。この考え方は、サポートされている型を拡張したい場合はいつでも、ボイラープレートの編集を恐れてしまうタイプキャストにつながり、単一のパラメータコールバックに対してのみ機能するという点でかなり制限的です。私はあなたが達成しようとしていることについてまだ明確ではありません。あなたはCommandオブジェクトを考慮したのだろうか? –