TVirtualInterface クラスに奇妙なバグがあることに気付きました。次のようなことを試しました:
ITest1 = interface
procedure Test1();
End;
ITest2 = Interface(ITest1)
procedure Test2();
End;
ITest3 = Interface(ITest2)
procedure Test3();
ENd;
procedure Test();
var
test : ITest3;
begin
test := TVirtualInterface(TypeInfo(ITest3),
procedure(Method: TRttiMethod;
const Args: TArray<TValue>; out Result: TValue)
begin
showMessage(Method.Name);
end) as ITest3;
test.test1();
test.test2();
test.test3();
End;
上記のコードは正常に動作します。このように変更すると:
ITest3 = Interface(ITest2)
procedure Test3();
function GetLabel : string;
property Label : string read GetLabel;
ENd;
そして私は電話します:
showmessage(test.Label);
...それはまだ動作します。
しかし、このプロパティを ITest2 または ITest1 に移動すると、ITest1、ITest2、または ITest3 のいずれかのメソッドを呼び出すと、間違ったメソッドが呼び出されます (たとえば、test.Test2() は「Test3」と表示されます)、クラッシュ (アクセス違反) のいずれかになります。 .
これに対する説明や修正はありますか?
編集 >> 申し訳ありませんが、実際には次のようなプロパティでのみ失敗するようです:
property Item[Name : string] : X read GetX write SetX;