1
type
  TObjA = class
    a: string;
  end;
type
  worker<T> = interface
    function step1(v: integer): T;
    function step2(s: string): T;
  end;

type
  ImplA<T> = class(TInterfacedObject, worker<T>)
    function step1(v: integer): T;
    function step2(s: string): T; virtual; abstract;
  end;

type
  ImplB = class(ImplA<TObjA>)
    function step2(s: string): TObjA;
  end;
implementation


function ImplA<T>.step1(v: integer): T;
begin
  result := step2(IntToStr(v));
end;

function ImplB.step2(s: string): TObjA;
var
  r: TObjA;
begin
  r := TObjA.Create;
  r.a := 'step2 ' + s;
  result := r;
end;

この構造に従って機能を構築しようとしています。Javaで動作することはわかっていますが、現在delphi 2010で動作しています。ImplB.step1(1)を呼び出すと抽象的なエラーが発生します。これを修正するにはどうすればよいですか。

4

1 に答える 1

5

function step2(s: string): TObjA;として宣言していないため、エラーが発生しますoverride

だから

function ImplA<T>.step1(v: integer): T;
begin
  result := step2(IntToStr(v));
end;

あなたが期待しているのとは違うところstep2から呼び出してImplAいますImplB

また、戻り値の型をジェネリック オブジェクトから TObjA に変更すると、コンパイラはそれを好まないかもしれませんが、ジェネリックをサポートしてテストする Delphi のコピーはありません。

于 2013-03-18T15:38:14.830 に答える