Delphi:像Java一样构造抽象类

时间:2013-12-11 14:42:51

标签: java delphi abstract-class

好奇,我能在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;

2 个答案:

答案 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;

但是,我更喜欢子类中的实际实现。