gpt4 book ai didi

delphi - 如何正确让界面支持迭代?

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

如何从接口(interface)公开此 TList,如 IEnumeratorIEnumerator<IFungibleTroll> ?我正在使用 Delphi XE。

这是我的进展:

unit FungibleTrollUnit;

interface

uses
Windows, Messages, SysUtils,
Variants, Classes, Graphics,
Controls, Forms,
Generics.Collections;

type
IFungibleTroll = interface
['{03536137-E3F7-4F9B-B1F5-2C8010A4D019}']
function GetTrollName:String;
function GetTrollRetailPrice:Double;
end;


TFungibleTrolls = class (TInterfacedObject,IEnumerable<IFungibleTroll>)
protected
FTrolls:TList<IFungibleTroll>;

public
// IEnumerable
function GetEnumerator:IEnumerator<IFungibleTroll>;//
// function GetEnumerator:IEnumerator; overload;

// find/search app feature requires searching.
// this

function FindSingleItemByName(aName:String;patternMatch:Boolean):IFungibleTroll;
function FindMultipleItemsByName(aName:String;patternMatch:Boolean):IEnumerable<IFungibleTroll>;
function FindSingleItemByIdentifier(anIdentifer:String):IFungibleTroll;// use internal non-visible identifier to find an app.

constructor Create;

property Trolls:TList<IFungibleTroll> read FTrolls; // implements IEnumerable<IFungibleTroll>;??
private
end;




implementation


{ TFungibleTrolls }

constructor TFungibleTrolls.Create;
begin
FTrolls := TList<IFungibleTroll>.Create;

end;

function TFungibleTrolls.FindMultipleItemsByName(aName: String;
patternMatch: Boolean): IEnumerable<IFungibleTroll>;
begin

end;

function TFungibleTrolls.FindSingleItemByIdentifier(
anIdentifer: String): IFungibleTroll;
begin

end;

function TFungibleTrolls.FindSingleItemByName(aName: String;
patternMatch: Boolean): IFungibleTroll;
begin

end;



function TFungibleTrolls.GetEnumerator: IEnumerator<IFungibleTroll>;
begin
result := FTrolls.GetEnumerator;
end;

//function TFungibleTrolls.GetEnumerator: IEnumerator;
//begin
// result := FTrolls.GetEnumerator; // type IEnumerator<IFungibleTroll> or IEnumerator?
//end;


end.

我陷入了三个错误之一,我不知道如何解决:

[DCC Error] FungibleTrollUnit.pas(26): E2252 Method 'GetEnumerator' with identical parameters already exists-或-

[DCC Error] FungibleTrollUnit.pas(19): E2291 Missing implementation of interface method IEnumerable.GetEnumerator-或者- [DCC Error] FungibleTrollUnit.pas(19): E2291 Missing implementation of interface method IEnumerable.GetEnumerator

如果我声明 TFungibleTrolls 来实现 IEnumerable,我似乎必须声明两种形式的 GetEnumerator,但我似乎无法弄清楚如何做到这一点,无论是使用重载,还是不使用重载,或者使用“方法解析子句” “,像这样:

      function IEnumerable.GetEnumerator = GetPlainEnumerator; // method resolution clause needed?
function GetEnumerator:IEnumerator<IFungibleTroll>;
function GetPlainEnumerator:IEnumerator;

这可能看起来像是 IEnumerable 的一个非常基本的使用,并且使接口(interface)支持迭代,但是,我被困住了。

更新:似乎当我尝试在没有先声明 List<T> 的情况下执行此操作时,我陷入了裂缝,原因是 IEnumerable<T>继承自IEnumerable然而,我的类必须提供多个方法,而不是单个 get 枚举器方法,并且因为我的类不是泛型,所以它无法直接“将自身映射”到 IEnumerable 的要求,除非我使用泛型 List<T>声明。 Marjan 的示例在编译到项目 (.dproj+.dpr) 中时有效,但在构建到包 (.dproj+.dpk) 中并在 IDE 中编译时无效。它可以在包中的命令行中正常工作,但不能在包中的 IDE 中。

最佳答案

不是直接回答你的问题(仍在研究中),但这就是我为获得“接口(interface)枚举器”所做的事情,即支持迭代的接口(interface)类:

IList<T> = interface(IInterface)
[...]
function GetEnumerator: TList<T>.TEnumerator;
function Add(const Value: T): Integer;
end;

type
TBjmInterfacedList<T> = class(TBjmInterfacedObject, IList<T>)
strict private
FList: TList<T>;
function GetEnumerator: TList<T>.TEnumerator;
strict protected
function Add(const Value: T): Integer;
public
constructor Create; override;
destructor Destroy; override;
end;

implementation

constructor TBjmInterfacedList<T>.Create;
begin
inherited;
FList := TList<T>.Create;
end;

destructor TBjmInterfacedList<T>.Destroy;
begin
FreeAndNil(FList);
inherited;
end;

function TBjmInterfacedList<T>.GetEnumerator: TList<T>.TEnumerator;
begin
Result := FList.GetEnumerator;
end;

function TBjmInterfacedList<T>.Add(const Value: T): Integer;
begin
Result := FList.Add(Value);
end;

然后你可以做这样的事情:

ISite = interface(IInterface)
...
end;
ISites = interface(IList<ISite>);
...
end;

var
for Site in Sites do begin
...
end;

实现如下类:

TSite = class(TBjmInterfacedObject, ISite)
...
end;
TSites = class(TBjmInterfacedList<ISite>, ISites)
...
end;

更新

示例项目源已上传至 http://www.bjmsoftware.com/delphistuff/stackoverflow/interfacedlist.zip

关于delphi - 如何正确让界面支持迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6389357/

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