好奇,我能在Delphi中构建一个像Java Style一样的抽象类吗?
Java声明:
public abstract class Foo {
public abstract void test();
}
使用方法:
public void testCsontruct() {
Foo clsfoo = new Foo(){
public void test(){
//....do something here
}
};
}
德尔福声明:
Tfoo = class
public
procedure test; virtual; abstract;
end;
使用方法:
procedure testUse;
var
foo:Tfoo;
begin
foo:=Tfoo.Create; //can we implement the test method here ? how?
end;
答案 0 :(得分:5)
Java功能是匿名类。它们在许多场景中都很有用。除了您所说明的内容之外,它们通常用于捕获封闭范围内的变量。
在Delphi中没有任何类似的语法。匿名方法很接近,但是没有语法允许您使用匿名方法替换实例化对象的虚方法。
您需要子类来提供虚拟方法的具体实现。您可以在通常的方式在编译时进行子类,或者在运行时使用虚方法拦截器或类似的VMT技巧进行子类化。
答案 1 :(得分:4)
您可以使用虚拟方法拦截器执行此操作:
uses
Rtti;
...
begin
foo := TFoo.Create;
vmi := TVirtualMethodInterceptor.Create(foo.ClassType);
vmi.OnBefore :=
procedure(Instance: TObject; Method: TRttiMethod; const Args: TArray<TValue>; out DoInvoke: Boolean;
out Result: TValue)
begin
if Method.Name = 'test' then
begin
DoInvoke := false;
// do something here
end;
end;
vmi.Proxify(foo);
foo.test;
foo.Free;
vmi.Free;
end;
但是,我更喜欢子类中的实际实现。