【问题标题】:Generic Tlist<IMyInterface> in delphidelphi 中的通用 Tlist<IMyInterface>
【发布时间】:2014-02-09 19:43:20
【问题描述】:

我有一个接口的 TList

IImage = interface
// another methods...
  procedure Draw;
end;

在画布中绘制不同的东西。

和一个父类

TCustomImage = class(TInterfacedObject, IImage)
   procedure Draw; virtual; abstract;
end;

还有几个子类

TSomeShape = class(TCustomImage, IImage)
   procedure Draw(aCanvas:TCanvas); reintroduce; overload;
end;

TSomeAnotherShape = class(TCustomImage, IImage)
   procedure Draw(aCanvas:TCanvas); reintroduce; overload;
end;

我想编码如下:

var
  list : TList<IImage>;
  shape : IImage;
begin
  try
    list := TList<IImage>.Create;

    list.Add(TSomeShape.Create(atSomePosition));
    list.Add(TSomeAnotherShape.Create(atSomePosition));

    // or better :)
    for shape in list do
      shape.Draw(Canvas); // TSomeShape and TSomeAnotherShape respectively.

  finally
    FreeAndNil(list);
  end;  
end;

UPD
我想将list.Items[I].draw() 与正确的类一起使用(TSomeShapeTSomeAnotherShape)。但是现在,我发现这个IImage 接口是不可能的。我在 IImage 中有一个方法 Draw(Canvas:TCanvas),但我认为在类中重新引入方法是可以接受的。

谢谢,我会处理我的代码。 :)

【问题讨论】:

  • 您遇到的实际问题是什么?您所做的只是提供一个代码示例,但没有任何解释。
  • 如果通过下面的解决方案解决了这个问题,请通过打勾将其标记为已接受的答案。

标签: delphi interface delphi-xe generic-list


【解决方案1】:

问题是您的接口定义不正确。您的具体类使用此签名实现方法:

procedure Draw(Canvas: TCanvas);

但是你的接口定义了一个带有这个签名的方法:

procedure Draw;

您确实需要您的接口和具体的实现相匹配。你会想要这样的代码:

type
  IImage = interface
    procedure Draw(Canvas: TCanvas);
  end;

  TCustomImage = class(TInterfacedObject, IImage)
    procedure Draw(Canvas: TCanvas); virtual; abstract;
  end;

  TSomeShape = class(TCustomImage)
    procedure Draw(Canvas: TCanvas); override;
  end;

  TSomeOtherShape = class(TCustomImage)
    procedure Draw(Canvas: TCanvas); override;
  end;

现在一切都匹配了,你的代码应该可以正常编译,甚至可以按照你的意愿去做。


顺便说一句,您的try 放错地方了。您必须在实例化对象之后放置它。写

obj := TSomeClass.Create;
try
  // use obj
finally
  obj.Free;
end;

正如您在代码中所拥有的那样,构造函数中的异常将导致 finally 块运行并尝试在未初始化的引用上调用 free。

【讨论】:

    猜你喜欢
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多