尝试构建基于接口和泛型的图并获得奇怪的错误 - 请注意错误行中“整数”一词的大小写差异。
文本解析器传递给Graph实现,然后由Graph调用以构建其基本数据结构。进一步的IGraphConstructor对象可以构建 更复杂的实际图形而不仅仅是填充基本字典。
IGraphConstructor<K,V> = interface
function Construct(AData : TObjectDictionary<K,V>) : boolean;
end;
IGraph<K,V> = interface
['{B25EEE1F-3C85-43BB-A56B-3E14F7EA926C}']
function Construct(AConstructor : IGraphConstructor<K,V>) : boolean;
function GetNodes : TObjectDictionary<K,V>;
property Nodes : TObjectDictionary<K,V> read GetNodes;
end;
TGraph<K,V> = class(TComponent, IGraph<K,V>)
private
FData : TObjectDictionary<K,V>;
function GetNodes : TObjectDictionary<K,V>;
...
//the editor
TVirtualEditor = class(TComponent)
private
FGlyphs : TGraph<integer,TGlyph>;
...
TTextParser<integer,TGlyph> = class(TInterfacedObject, IGraphConstructor<integer,TGlyph>)
...
和...
function TVirtualEditor.Edit(AText: string): boolean;
var
parser : TTextParser<integer,TGlyph>;
begin
parser := TTextParser<integer,TGlyph>.Create(AText);
result := FGlyphs.Construct(parser);
end;
function TTextParser<integer,TGlyph>.Construct(AData: TObjectDictionary<integer,TGlyph>): boolean;
var
i : integer;
begin
for i := 1 to length(FText) do
begin
//#1
AData.AddOrSetValue(i, TGlyph(TCharGlyph.Create( FText[i] )) ); //!--> error [DCC Error] ...: E2010 Incompatible types: 'integer' and 'Integer'
end;
//uc....
end;
将TTextParser声明为TTextParser<K,V>
并将其用作
TParser : TTextParser<integer,TGlyph>;
的#1处的返回和错误
[DCC Error] ...: E2010 Incompatible types: 'K' and 'Integer'
编辑:解决方法
找到了解决方法,但不确定是否可以这样做。
function TTextParser<K,V>.Construct(AData: TObjectDictionary<K,V>): boolean;
var
i : integer;
n : K;
o : V;
begin
for i := 1 to length(FText) do
begin
n := K((@i)^);
o := V(TCharGlyph.Create( FText[i] ));
AData.AddOrSetValue(n, o );
end;
result := true;
end;
答案 0 :(得分:5)
该行
TTextParser<integer,TGlyph> = class(TInterfacedObject, IGraphConstructor<integer,TGlyph>)
描述了一种泛型类型,其中两个使用的泛型类型名称是 integer 和 TGlyph (例如 K 和 V 在IGraph<K,V>
)。这些只是占位符,不应与现有类型integer
和TGlyph
混淆。
答案 1 :(得分:1)
如果K
是整数,我假设您想要实现某些特殊行为。这称为专业化,可以在C ++(link to MSDN magazine article covering template specialization)中使用,但在Delphi中则不行。最好避免使用这种特化,只使用泛型类型K
(这应该很简单,否则通用类首先没有多大意义)。
如果您确实需要特殊情况,则有一种解决方法:您可以比较类型信息(您需要包含单位TypInfo
):
if (TypeInfo(K) = TypeInfo(Integer)) then
begin
// special case
end;