Delphi 不兼容的类型

标签 delphi

我有一个非常奇怪的错误,我试图重新启动我的 IDE,但它没有修复它。

我创建了一个如下所示的界面:

myInterface = interface
 ['{delphi guid key here}'] (CTRL+ALT+G)
 function getDataPCE : IDataPCE;
 property dataPCE : IDataPCE read getDataPCE;
 (some other properties that works)
end;

然后我创建了从这个接口(interface)继承的对象
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;

最佳答案

为了帮助您了解如何提问,这里是您应该提交的 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 Error] E2008 Incompatible types



原因是 IRioPiece 类型的属性的属性 getter 必须是不接受参数且返回类型为 IRioPiece 的函数.但是您的 getter 函数需要两个参数,并且它们需要来自某个地方。如上所述,当您访问该属性时,不会提供这些参数。

因此,您可以通过更改 getDataPCE 的声明来修复编译错误。到:
function getDataPCE: IRioPiece;

但这几乎肯定是错误的解决方案。大概您将这些参数声明为 getDataPCE因为你需要提供它们。在这种情况下,您无法删除它们。这意味着你不能声明一个简单的属性 dataPCEgetDataPCE 支持.我的猜测是您只需要删除 dataPCE属性(property)。

当然,您可以声明 array property像这样:
property dataPCE[numRegister: String; numPCEFormated: String]: IRioPiece 
  read getDataPCE;

这意味着您可以像这样访问该属性:
dataPCE := resvervation.dataPCE[numRegister, numPCEFormatted];

但对我来说,这将属性(property)的使用延伸得太远了。我认为最好使用函数来访问它。

结论

删除 dataPCE属性并让接口(interface)调用的使用者 getDataPCE反而。

关于Delphi 不兼容的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29622134/

相关文章:

c# - Marshall结构通过sendmessage将其传递给delphi记录

html - 将样式插入 TWebBrowser

delphi - 如果Blob包含特定数据,则更新Blob时出现问题

delphi - 使用 NTQuerySystemInformation/NtQueryInformationFile/NtQueryObject 获取进程使用的 Unicode 文件名

delphi - Delphi XE中如何自动实现继承的抽象方法

delphi - @映射方法入口点时的运算符用法

delphi - catch 启动应用程序

.net - delphi xe2实现.net制作的wcf并支持回调

c++ - Embarcadero TThread : Pass TThreadMethod in C++

mysql - 使用 Delphi 和firedac 编辑MySQL 中的日期时间字段