4

我正在尝试实现 Spring 4 Delphi,并且只对接口而不是类进行编程。但是,当您想使用 TObjectList 时,这似乎是不可能的。

考虑以下代码:

unit Unit1;

interface

uses
  Spring.Collections,
  Spring.Collections.Lists;

type

  IMyObjParent = interface
  ['{E063AD44-B7F1-443C-B9FE-AEB7395B39DE}']
    procedure ParentDoSomething;
  end;

  IMyObjChild = interface(IMyObjParent)
  ['{E063AD44-B7F1-443C-B9FE-AEB7395B39DE}']
    procedure ChildDoSomething;
  end;

implementation

type
  TMyObjChild = class(TInterfacedObject, IMyObjChild)
  protected
    procedure ParentDoSomething;
  public
    procedure ChildDoSomething;
  end;


{ TMyObj }

procedure TMyObjChild.ChildDoSomething;
begin

end;

procedure TMyObjChild.ParentDoSomething;
begin

end;

procedure TestIt;
var
  LMyList: IList<IMyObjChild>;
begin
  TCollections.CreateObjectList<IMyObjChild>;
  //[DCC Error] Unit1.pas(53): E2511 Type parameter 'T' must be a class type
end;

end.

我知道我可以在上面的示例中将 IMyObjChild 更改为 TMyObjChild,但是如果我需要在另一个单元或表单中进行更改,那么我该怎么做呢?

一旦你需要一个 TObjectList,试图只对接口进行编程似乎太难或不可能了。

Grrr ...有什么想法或帮助吗?

4

1 回答 1

6

CreateObjectList有一个泛型约束,它的类型参数是一个类:

function CreateObjectList<T: class>(...): IList<T>;

您的类型参数不符合该约束,因为它是一个接口。关于对象列表的事情是它包含对象。如果您看一下TObjectListSpring.Collections.Lists您会发现它还具有其类型参数是类的通用约束。并且由于CreateObjectList要创建一个TObjectList<T>,它必须反映类型约束。

存在的理由TObjectList<T>是通过OwnsObjects. 与同名的经典 Delphi RTL 类非常相似。当然你持有接口,所以你根本不需要这个功能。你应该打电话CreateList。一个普通TList<T>的就是你需要的,即使你通过IList<T>界面引用它。

LMyList := TCollections.CreateList<IMyObjChild>;
于 2014-03-27T06:48:12.637 回答