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