如果您需要访问某些方法,为什么要用接口隐藏它们?接口就是这样:描述其他人可以与该对象进行交互的方式 [interface]:如果您希望其他类作为接口对象与您的类进行交互,那么这些方法应该是界面。
使用接口作为简化终结的快捷方式,然后通过强制转换来破解它违反了接口的整个概念,并且还可能导致内存泄漏和难以追踪 AV,因为您混合引用的方式:有时是接口,有时是 TObject。
谁能指出我使用对象的教程或最佳实践
TList 中的接口?
您的问题与 TList 无关。 TList 所做的只是保存对对象的引用,无论它们是如何设计的——它对对象接口或实现的细节一无所知。正如@ArnaudBouchez 在 cmets 中指出的那样,您的问题是您没有正确设计类和接口。
我开始实施此模型以利用参考
计数作为 TObjectList 的替代品(我广泛使用)
为什么有必要这样做?为了简化定稿? TObjectList 默认拥有它的对象。 (您还可以设置OwnsObjects 属性)。如果您使用 TObjectList,则不需要使用接口来自动进行清理。您只需释放 TObjectList 实例,就像您必须释放 TList 一样。除非您出于特定原因需要接口,否则使用 Objects 和 TObjectList 可以说是更可取的,因为与接口相反,您的最终确定是确定性的。
来自 XE 帮助:
创建 TObjectList 实例。
此重载方法创建一个 TObjectList 实例。
OwnsObjects 参数是一个布尔值,表示对象是否
条目归列表所有。如果对象是拥有的,当条目
从列表中删除,对象被释放。拥有对象
属性是从此参数的值设置的。默认为真。
当你释放 TObjectList 时,OwnObjects=True 时对象也会被释放。
请参阅:
Clear a TList or a TObjectList (accepted answer there)
知道:通常情况下,作为 Delphi 开发人员,您完全没有理由涉足引用计数的细节。如果你觉得你需要这样做,那么你的设计在基本层面上是有问题的。引用计数在 TInterfacedObject 中实现,并且透明地工作。您的所有 Delphi 接口对象都应派生自 TInterfacedObject(或其同级或派生类之一),如下所示:
interface
...
type
IMyInterface=interface (IUnknown)
[GUID]
function GetValue:integer;
end;
TMyInterface=class(TInterfacedObject,IMyInterface)
protected
function GetValue:integer;
end;
implementation
...
TMyInterface.GetValue:integer;
begin
result := fValue;
end;
end.
然后像这样使用它:
procedure useValue;
var im:IMyInterface;
x:integer;
begin
im:=TMyInterface.create;
x:=im.GetValue;
showMessage(inttstr(x));
end;
当useValue 返回时,im 将被清理——您无需执行任何操作或担心引用计数。 TInterfacedObject 负责所有这些。
请注意,在 useValue 中,您将引用声明为 IMyInterface,但调用 TMyInterface 的类构造函数 - 这就是您必须初始化接口的方式 - 接口没有构造函数。但是,由于您的引用类型是 IMyInterface,编译器就是这样处理它的 - 只有通过 IMyInterface 公开的方法才能访问。