找到了!我需要创建一个新的类,我称之为TItemEnumerator,我还将其包含在TXmlFileList类中,紧跟在TItem之后:
type
TItemEnumerator = class( TObject )
strict private
FOwner: TXmlFileList;
FIndex: Integer;
protected
constructor Create(AOwner: TXmlFileList);
public
function GetCurrent: TItem;
function MoveNext: Boolean;
property Current: TItem read GetCurrent;
end;
实现很简单,只是TXmlFileList的一个附加方法:
function GetEnumerator: TItemEnumerator;
最后,将类公开给外部世界,我将其添加到TXmlFileList中:
type TXmlFile = TXmlFileList.TItem;
它产生了以下代码:
type
TXmlFileList = class( TInterfacedObject )
private
type
TItem = class( TInterfacedObject )
strict private
FCaption: string;
protected
constructor Create( const ACaption: string; const AXML: WideString );
public
destructor Destroy; override;
property Caption: string read FCaption;
end;
type
TItemEnumerator = class( TObject )
strict private
FOwner: TXmlFileList;
FIndex: Integer;
protected
constructor Create(AOwner: TXmlFileList);
public
function GetCurrent: TItem;
function MoveNext: Boolean;
property Current: TItem read GetCurrent;
end;
strict private
FXmlFiles: array of TXmlFileList.TItem;
strict protected
function GetXmlFile( index: Integer ): TXmlFileList.TItem;
public
type TXmlFile = TXmlFileList.TItem;
constructor Create( );
destructor Destroy; override;
function Add( const ACaption: string; const AXML: WideString ): Integer; overload;
function Add( const AFilename: string ): Integer; overload;
function Count: Integer;
function GetEnumerator: TItemEnumerator;
procedure Clear;
property XmlFile[ index: Integer ]: TXmlFileList.TItem read GetXmlFile; default;
end;
是的,当你看到它的时候,你可以开始挠头,但是这是一个很好的解决方案,可以把许多功能隐藏起来,不让没有经验的开发人员看到!现在他们只看到他们需要看到的。(希望他们永远不要看这个源代码!)
我只是想我需要写更多的代码。。。
为什么要用不同的名称来显示滴度类型?实际上,这些类又被包装在一个更大的类TXmlManager中,该类还处理样式表、转换、验证和其他一些事情。TXmlFile实际上是在TXmlManager级别公开的,而不是TXmlFileList类。TXmlManager包含一些其他类似的列表,我只是在其中重复使用名称TItem。但是没有冲突,因为需要添加父类来引用正确的类类型。