我有一个非常奇怪的错误,我试图重新启动我的IDE,但它没有修复它。
我创建了一个如下所示的界面:
myInterface = interface
['{delphi guid key here}'] (CTRL+ALT+G)
function getDataPCE : IDataPCE;
property dataPCE : IDataPCE read getDataPCE;
(some other properties that works)
end;
然后我创建了一个继承自当前接口
的对象myObject = class(TInterfacedObject, myInterface)
private
...
function getDataPCE : IDataPCE;
...
public
...
property dataPCE : IDataPCE read getDataPCE;
...
end;
" ..."意味着有一些其他的属性和功能,但与此无关。
我收到此错误:"不兼容的类型"
我该如何解决这个问题?
修改
IInfoNotisReservation = interface
['{AE5CEC31-B2CE-4A3D-9CFE-6393646E4A04}']
function getNumberPCE : String;
function getDataPCE(numRegister : String; numPCEFormated : String): IRioPiece;
procedure setNumberPCE(NumberPCE: String);
function getRegName : String;
procedure setRegName(RegName: String);
function getRegKey : String;
procedure setRegKey(RegKey: String);
property NumberPCE : String read getNumberPCE write setNumberPCE;
property RegName : String read getRegName write setRegName;
property RegKey : String read getRegKey write setRegKey;
property DataPCE : IRioPiece read getDataPCE;
end;
type
TInfoNotisReservation = class(TInterfacedObject, IInfoNotisReservation)
private
DataBase : IDataBase;
SuperRio : ISuperRio;
RioN : IRio;
fPCENum : String;
function getDataPCE(numRegister : String; numPCEFormated : String): IRioPiece;
function getNumberPCE: string;
function getRegKey: string;
function getRegName: string;
procedure setNumberPCE(NumberPCE: string);
procedure setRegKey(RegKey: string);
procedure setRegName(RegName: string);
procedure setRioN(Registre: string);
public
Constructor Create;
property DataPCE : IRioPiece read getDataPCE;
property NumberPCE : String read getNumberPCE write setNumberPCE;
property RegName : String read getRegName write setRegName;
property RegKey : String read getRegKey write setRegKey;
end;
function TInfoNotisReservation.getDataPCE(numRegister,
numPCEFormated: String): IRioPiece;
begin
setRioN(numRegister);
Result := RioN.GetPieceByID(RioN.PieceNumberToID(NumPCEFormated).Item[0].ID, FLAG_IGNORE_SECURITY);
end;
答案 0 :(得分:7)
为了帮助您了解如何提问,以下是您应该提交的MCVE。
type
IRioPiece = interface
end;
IInfoNotisReservation = interface
['{AE5CEC31-B2CE-4A3D-9CFE-6393646E4A04}']
function getDataPCE(numRegister: String; numPCEFormated: String): IRioPiece;
property dataPCE: IRioPiece read getDataPCE; // ERROR HERE
end;
begin
end.
这会导致此错误:
[dcc32错误] E2008不兼容的类型
原因是类型IRioPiece
的属性的属性getter必须是不接受任何参数且返回类型为IRioPiece
的函数。但是你的getter函数需要两个参数,它们需要来自某个地方。如上所述,访问该属性时不提供这些参数。
因此,您可以通过将getDataPCE
的声明更改为:
function getDataPCE: IRioPiece;
但这几乎肯定是错误的解决方案。据推测,您已将这些参数声明为getDataPCE
,因为您需要提供这些参数。在这种情况下,您无法删除它们。这意味着您无法声明由dataPCE
支持的简单属性getDataPCE
。我的猜测是你只需删除dataPCE
属性。
当然,您可以声明array property这样:
property dataPCE[numRegister: String; numPCEFormated: String]: IRioPiece
read getDataPCE;
这意味着您可以像这样访问该媒体资源:
dataPCE := resvervation.dataPCE[numRegister, numPCEFormatted];
但对我来说,这对房产的使用范围太大了。我认为最好使用函数来访问它。
<强>结论强>
删除dataPCE
属性,让接口的消费者调用getDataPCE
。