Delphi 通用Tlist<;IMyInterface>;在德尔菲

Delphi 通用Tlist<;IMyInterface>;在德尔菲,delphi,interface,delphi-xe,generic-list,Delphi,Interface,Delphi Xe,Generic List,我有一个界面列表 在画布上画不同的东西 和父类 还有几个儿童班 我想编码如下: var 名单:TList ;; 形状:IImage; 开始 尝试 列表:=TList.Create; 添加(TSomeShape.Create(atSomePosition)); 添加(TSomeAnotherShape.Create(atSomePosition)); //或者更好:) 对于列表中的形状,请执行以下操作: 形状。绘制(画布);//t分别为someshape和TSomeAnotherShape

我有一个界面列表

在画布上画不同的东西

和父类

还有几个儿童班

我想编码如下:

var
名单:TList ;;
形状:IImage;
开始
尝试
列表:=TList.Create;
添加(TSomeShape.Create(atSomePosition));
添加(TSomeAnotherShape.Create(atSomePosition));
//或者更好:)
对于列表中的形状,请执行以下操作:
形状。绘制(画布);//t分别为someshape和TSomeAnotherShape。
最后
FreeAndNil(列表);
结束;
结束;
UPD
我想用正确的类(
TSomeShape
TSomeAnotherShape
)使用
list.Items[I].draw()
)。但是现在,我发现用这个
IImage
接口是不可能的。我在IImage中有一个方法
Draw(Canvas:TCanvas)
,但我认为在类中重新引入该方法是可以接受的

谢谢.我会修改我的密码。
:)

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

procedure Draw(Canvas: TCanvas);
procedure Draw;
但您的接口定义了一个具有此签名的方法:

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。

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

procedure Draw(Canvas: TCanvas);
procedure Draw;
但您的接口定义了一个具有此签名的方法:

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。

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

procedure Draw(Canvas: TCanvas);
procedure Draw;
但您的接口定义了一个具有此签名的方法:

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。

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

procedure Draw(Canvas: TCanvas);
procedure Draw;
但您的接口定义了一个具有此签名的方法:

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。

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