2015-04-14 2 views
1

У меня действительно странная ошибка, я попытался перезапустить мою среду разработки, но не исправил ее.Delphi несовместимые типы

Я создал интерфейс, который выглядит следующим образом:

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; 

«...» означает, что некоторые другие свойства и функции, но не связанные с этим.

И я получаю эту ошибку: «Несовместимые типы»

Как я могу решить эту проблему?

EDIT

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

Код в вопросе компилируется в порядке. Представьте MCVE, который продемонстрирует вашу проблему. Как бы то ни было, этот вопрос будет закрыт как вне темы, потому что код в вопросе не показывает проблему, о которой вы сообщаете. –

+0

Что именно вы хотите? Я не понимаю, почему он говорит о типах неконтактных. Здесь у вас есть все, что я использую для этой реализации ... –

+1

Просьба представить MCVE, который демонстрирует проблему. Код в вопросе не создает ошибку, о которой вы сообщаете. О, и еще одно. Всегда сообщайте сообщения об ошибках дословно и всегда указывайте строку, по которой они происходят. –

ответ

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 Error] E2008 Incompatible types

Причина заключается в том, что свойство геттер для свойства типа IRioPiece должен быть функцией, которая не принимает никаких параметров и имеет тип 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 вместо этого.

+0

Но мне нужны эти параметры –

+1

Действительно. Это означает, что свойство не подходит. –

+0

да, хорошо, так что это работает, но странно, что это не работает с собственностью. Я удалил его и включил функцию в общедоступную декларацию, чтобы она работала так, но да ..:/Спасибо за помощь –

Смежные вопросы