gpt4 book ai didi

delphi - 如何使用接口(interface)返回对象列表?

转载 作者:行者123 更新时间:2023-12-03 19:25:09 25 4
gpt4 key购买 nike

我有2个接口(interface)..

IInterfaceA = interface
.....
End;

IInterfaceB = interface
['{834D7063-AE8F-40BF-B1E7-E0806EB991C7}']
Function getA (A: Integer): IInterfaceA;
  Function getList: TList <IInterfaceA>;
End;

TClassA = class (TInterfacedObject, IInterfaceA)
....
End

TClassB = class (TInterfacedObject, IInterfaceB)
  Function getA (A: Integer): IInterfaceA;
  Function getList: TList <IInterfaceA>;
End;

// It works
Function TClassB.getA (A: Integer): IInterfaceA;
Begin
  Result: = Manager.Find <TClassA> .Add (Linq.Eq ('fieldxxx', A.ToString).) UniqueResult;
End;

以下不起作用并产生此错误:

E2010 Incompatible types: 'System.Generics.Collections.TList <IInterfaceA>' and 'System.Generics.Collections.TObjectList <TClassB>'


Function TClassB.getList: TList <IInterfaceA>;
Begin
  // The TClassA class implements the interface IInterfaceA

  Result: = Manager.Find <TClassA> .List;
End;

我该如何解决?

最佳答案

从错误消息中可以明显看出问题所在。 Manager.Find<TClassA>.List正在返回 TObjectList<TClassB> (为什么是 TClassB 而不是 TClassA ?),它与 TList<IInterfaceA> 的类型不同,因此不能按原样返回。

要使代码编译,您需要更多类似的东西:

Function TClassB.getList: TList<IInterfaceA>;
var
Obj: TClassA;
begin
// The TClassA class implements the interface IInterfaceA
Result := TList<IInterfaceA>.Create;
try
for Obj in Manager.Find<TClassA>.List do
Result.Add(Obj as IInterfaceA);
except
Result.Free;
raise;
end;
end;

但是,这会带来两个问题:
  • Result 的内存管理.由于返回TList<IInterfaceA>不属于任何人,调用者必须手动 Free完成使用它时。如果 Manager 在原始代码中不是这种情况拥有 Find() 的列表返回。如果没有,那么您的原始代码一开始就会遇到这个问题。
  • 列表中对象的内存管理。由于 TInterfacedObject 对对象进行了引用计数,当它们的 IInterfaceA 时,它们的引用计数将增加。接口(interface)被添加到返回的 TList<IInterfaceA> ,然后在它们从列表中删除时递减。由于 Manager.Find() 返回的原始列表包含 TClassA对象指针而不是 IInterfaceA接口(interface)指针,对象的引用计数将无法正确管理。当TList<IInterfaceA>被释放/清除,您的对象可能会过早释放(除非您在将 TClassA 指针添加到 Manager 的列表时手动增加它们的引用计数,并在删除指针时手动减少它们)。

  • 否则,您需要更改 Manager.Find()返回 TList<IInterfaceA>而不是 TObjectList<TClassB> .

    您或许应该考虑重新考虑您的 Manager无论如何设计。为接口(interface)对象混合对象指针和接口(interface)指针是不好的设计。在处理接口(interface)对象时,您应该对所有事物都使用接口(interface)。否则,为避免出现问题,您的实现类需要覆盖 _AddRef()_Release()禁用引用计数的方法。

    关于delphi - 如何使用接口(interface)返回对象列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41490211/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com