Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 继承af list和record失败,即使类具有相同的泛型类型_Delphi_Generics_Inheritance - Fatal编程技术网

Delphi 继承af list和record失败,即使类具有相同的泛型类型

Delphi 继承af list和record失败,即使类具有相同的泛型类型,delphi,generics,inheritance,Delphi,Generics,Inheritance,我的目标是使用相同的代码创建几个类似的列表(这样我就不必多次编写LoadFromString()和LoadFromXML() 我做了一份TKeyValueList (及 TKeyIntValueList=类(TKeyValueList TKeyValueItem=class(TLockObject) 受保护的 FKey:T; FValue:变量; 等 TKeyValueList=类(TLockObject) 受保护的 FList:TList; ------等 那很好 但是,当我想要创建一个列表

我的目标是使用相同的代码创建几个类似的列表(这样我就不必多次编写LoadFromString()和LoadFromXML()

我做了一份TKeyValueList (及 TKeyIntValueList=类(TKeyValueList
TKeyValueItem=class(TLockObject)
受保护的
FKey:T;
FValue:变量;
等
TKeyValueList=类(TLockObject)
受保护的
FList:TList;
------等
那很好

但是,当我想要创建一个列表来保存通过TCP/IP(使用我自己的“RESTFUL”协议)发送的DB记录中的值时,它失败了

基类:

TDBRecord<IDT, FieldIDT> = class(TKeyValueList<FieldIDT> );
// Any ID type (i.e. Primary key from DB kan be int/string etc)
// Any type of field identifier, e.g. string for field name or my own 
// TCommDataType (enumeration like cdtTextID....)
TDBRecord=class(TKeyValueList);
//任何ID类型(即DB kan的主键为int/string等)
//任何类型的字段标识符,例如字段名字符串或我自己的
//TCommDataType(枚举,如cdtTextID…)
基本列表定义为

TDBRecordList<IDT, FieldIDT> = class(TList<TDBRecord<IDT, FieldIDT>)

TCommDataType和FieldIDT是否兼容

有几种可能会违反兼容性,请参阅:

我建议您尝试修改以下行:

TDBCommTypeIDRecord = class(TDBIntIDRecord<TCommDataType>);
TDBCommTypeIDRecord=class(TDBIntIDRecord);
进入:

TDBCommTypeIDRecord=class(TDBIntIDRecord);

看看是否仍然存在相同的错误。

我自己找到了解决方案:

  TDBListField<FieldIdT> = class(TObject)


    property ID    : FieldIdT read GetId;
    property Value : Variant read GetValue write SetValue;
在一片晴朗的蓝天上,唯一的一点黑云是需要使用接口和Move()使其工作。那么为什么还要使用泛型呢

这让我想起了我在assembler的日子:

函数TDBListField.IdToString():String;var TypInfo :PTypeInfo;TmpInt:Integer;Size:Integer

开始尝试TypeInfo:=PTypeInfo(TypeInfo(FieldIdT));TmpInt :=0

案例类型信息^。有点 tkUnknown:引发异常。创建('woops')

类函数TDBListField.IDsEqual(AA:FieldIdT;AB: FieldIdT):布尔值;var-Cmp:IComparer

开始Cmp:=TComparer.Default

结果:=Cmp。比较(AA,AB)=0

结束


我非常确定编译器是正确的,您的代码不需要编译。但是很难看穿所有细节。A会有帮助。谢谢,但目前我更担心的是,我了解到Google Play ending支持32位应用程序。这对我的项目是一个重大打击,因为Delphi没有编译成ndroid 64位。如果我仍然使用Delphi,并且不重写所有内容,我会回来的。这两个问题中,您需要帮助解决哪一个?谢谢,但我相信这样做只会推迟问题。最终我将不得不使其成为TCommDataType。但目前我更担心Google Play对32位应用程序的支持。这是一个问题这对我的计划是个重大打击。
TDBCommTypeIDRecord = class(TDBIntIDRecord<TCommDataType>);

TDBCommTypeIDList = class(TDBIntIDRecordList<TCommDataType>) 
///////////////

TDBRecord<IDT, FieldIDT> = class(TKeyValueList<FieldIDT> );

TDBRecordList<IDT, FieldIDT, T : TDBRecord<IDT, FieldIDT>> = class(TList<T>);


TDBIntIDRecord<FieldIDT> = class(TDBRecord<Integer, FieldIDT>);

TDBIntIDRecordList<FieldIDT, T : TDBIntIDRecord<FieldIDT>> = class(TDBRecordList<Integer, FieldIDT, T>);


///////////////
TDBCommTypeIDRecord = class(TDBIntIDRecord<TCommDataType>);
TDBCommTypeIDRecord = class(TDBIntIDRecord<FieldIDT>); 
  TDBListField<FieldIdT> = class(TObject)


    property ID    : FieldIdT read GetId;
    property Value : Variant read GetValue write SetValue;
 TDBRecordList<FieldIdT> = class(TList<TDBRecord<FieldIdT>>)
var  
 ID         : Variant;     MyDBRecord : TDBRecord;

  begin
 MyDBRecord   := FRecordList[0];   ID           := MyDBRecord[tetID].Value;
  end;
 tkInteger,
 tkInt64       : begin

                  Size   := SizeOf(FieldIdT);
                  Move(FId, TmpInt, Size);
                  Result := IntToStr(TmpInt);
                 end;


 tkEnumeration : begin