Delphi不兼容的类型

时间:2015-04-14 08:04:54

标签: 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;

然后我创建了一个继承自当前接口

的对象
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;

1 个答案:

答案 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