无法转换作为接口的 TList<T> 项
Not able to cast TList<T> item that is an interface
为什么此代码无法从需要特定接口的泛型列表转换为 IDeletableNode。
此代码示例无法执行 IDeletableNode.Delete 过程,无论我如何转换它。
unit DeletableGenericsTest;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, xmldom, XMLDoc, XMLIntf, Generics.Collections;
type
IDeletableNode = interface(IXMLNode)
['{04D7A0C0-8E87-412B-BC55-230C7080D410}']
procedure Delete;
end;
INodeOfData = interface(IDeletableNode)
['{368917D8-402F-4BA2-8BC5-B0DB51B1BAE9}']
function Get_MyKey : string;
property MyKey : string read Get_MyKey;
end;
TDeletableList<T: IDeletableNode> = class(TList<T>)
procedure DeleteAll;
end;
TNodeOfData = class(TXMLNode, INodeOfData)
protected
function Get_MyKey: string;
public
procedure Delete;
end;
TForm1 = class(TForm)
private
fListOfNodes : TDeletableList<TNodeOfData>;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TDeletableList<T> }
procedure TDeletableList<T>.DeleteAll;
var
index : Integer;
begin
for index := Self.Count - 1 downto 0 do
Self[index].Delete;
end;
{ TNodeOfData }
procedure TNodeOfData.Delete;
begin
// delete some stuff;
end;
function TNodeOfData.Get_MyKey: string;
begin
result := '123ABC';
end;
end.
我在这里遗漏了什么或者这是正确的吗?
您问题中的代码因以下错误而失败:
[dcc32 Error] E2514 Type parameter 'T' must support interface 'IDeletableNode'
在这一行:
fListOfNodes : TDeletableList<TNodeOfData>;
编译器已经很清楚地告诉您,TNodeOfData
必须实现 IDeletableNode
,但实际上并没有。这是因为对通用参数的约束:
TDeletableList<T: IDeletableNode> = class(TList<T>)
所以改变
TNodeOfData = class(TXMLNode, INodeOfData)
到
TNodeOfData = class(TXMLNode, IDeletableNode, INodeOfData)
您的代码将编译。
为什么此代码无法从需要特定接口的泛型列表转换为 IDeletableNode。
此代码示例无法执行 IDeletableNode.Delete 过程,无论我如何转换它。
unit DeletableGenericsTest;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, xmldom, XMLDoc, XMLIntf, Generics.Collections;
type
IDeletableNode = interface(IXMLNode)
['{04D7A0C0-8E87-412B-BC55-230C7080D410}']
procedure Delete;
end;
INodeOfData = interface(IDeletableNode)
['{368917D8-402F-4BA2-8BC5-B0DB51B1BAE9}']
function Get_MyKey : string;
property MyKey : string read Get_MyKey;
end;
TDeletableList<T: IDeletableNode> = class(TList<T>)
procedure DeleteAll;
end;
TNodeOfData = class(TXMLNode, INodeOfData)
protected
function Get_MyKey: string;
public
procedure Delete;
end;
TForm1 = class(TForm)
private
fListOfNodes : TDeletableList<TNodeOfData>;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TDeletableList<T> }
procedure TDeletableList<T>.DeleteAll;
var
index : Integer;
begin
for index := Self.Count - 1 downto 0 do
Self[index].Delete;
end;
{ TNodeOfData }
procedure TNodeOfData.Delete;
begin
// delete some stuff;
end;
function TNodeOfData.Get_MyKey: string;
begin
result := '123ABC';
end;
end.
我在这里遗漏了什么或者这是正确的吗?
您问题中的代码因以下错误而失败:
[dcc32 Error] E2514 Type parameter 'T' must support interface 'IDeletableNode'
在这一行:
fListOfNodes : TDeletableList<TNodeOfData>;
编译器已经很清楚地告诉您,TNodeOfData
必须实现 IDeletableNode
,但实际上并没有。这是因为对通用参数的约束:
TDeletableList<T: IDeletableNode> = class(TList<T>)
所以改变
TNodeOfData = class(TXMLNode, INodeOfData)
到
TNodeOfData = class(TXMLNode, IDeletableNode, INodeOfData)
您的代码将编译。