-
вопрос таков, из кода будет ясно, думаю:
класс (BaseInstrClass.pas)
TPayTool = class (TInterfacedObject, IPayTool)
APayTool = array of TPayTool;
TCardInstruments = class (TInterfacedObject, ICardInstruments)
private
FPayTool: APayTool;
function GetPayTools: APayTool;
procedure SetPayTools (new: APayTool);
public
property PayTools: APayTool read GetPayTools write SetPayTools;
end;
интерфейс
IPayTool = interface (IInterface)
APayTool = array of IPayTool;
ICardInstruments = interface (IInterface)
['{6C1FC184-EBA3-4EAB-9A26-BC693A49642A}']
function GetPayTools: APayTool;
procedure SetPayTools (new: APayTool);
property PayTools: APayTool read GetPayTools write SetPayTools;
end;
явно что-то не то в интерфейсе.
ошибка при компиляции
[Error] BaseInstrClass.pas(133): Declaration of 'GetPayTools' differs from declaration in interface 'ICardInstruments'
[Error] BaseInstrClass.pas(133): Declaration of 'SetPayTools' differs from declaration in interface 'ICardInstruments'
Подскажите, как правильно организовать работу? Плиз код, а не советы "почитать", копал в инете, не накопал.
-
type
IPayTool = interface (IInterface)
end;
TPayTool = class (TInterfacedObject, IPayTool);
APayTool = array of TPayTool;
ICardInstruments = interface (IInterface)
['']
function GetPayTools: APayTool;
procedure SetPayTools (new: APayTool);
property PayTools: APayTool read GetPayTools write SetPayTools;
end;
TCardInstruments = class (TInterfacedObject, ICardInstruments)
private
FPayTool: APayTool;
function GetPayTools: APayTool;
procedure SetPayTools (new: APayTool);
public
property PayTools: APayTool read GetPayTools write SetPayTools;
end;
Все чудесно компилируется, не вижу никаких проблем.
-
проблема в том, что это разные юниты.
Предполагается объект хранить в одной dll, а через интерфейс получать доступ к нему из других dll.
В таком случае при описании интерфейса я не могу писать
APayTool = array of TPayTool;
ICardInstruments = interface (IInterface)
...
property PayTools: APayTool
...
так как это включит код TPayTool во вторую dll, чего необходимо избежать.
-
Разнеси декларацию и реализацию классов и декларацию интерфейсов по разным юнитам.
-
> APayTool = array of TPayTool;
А это вообще выкини за ненадобностью.
-
Кстати, библиотека с реализованным интерфейсным объектом CardInstruments будет использоваться только дельфийскими вызывающими модулями ?
Если нет, то это работать не будет, даже будучи успешно скомпилированным.
-
"Разнеси декларацию и реализацию классов и декларацию интерфейсов по разным юнитам."
Так и сделано уже.
"> APayTool = array of TPayTool;
А это вообще выкини за ненадобностью."
Кхм. А массив-то где я объявлю? В модуле с интерфейсом, останется APayTool = array of IPayTool ?
Планируется только в Делфи использовать.
-
> В модуле с интерфейсом, останется APayTool = array of IPayTool
> ?
Да.
А разве этого недостаточно ?
> Планируется только в Делфи использовать
А как остоит дело насчет единоэкземплярности BMM ?
-
Такс, в общем и целом я проблему решил иначе.
Массив не виден в интерфейсе, сделал функцию доступа к элементу массива по индексу.
А что есть ВММ?
-
> Массив не виден в интерфейсе, сделал функцию доступа к элементу
> массива по индексу
И это правильное решение.
> что есть ВММ?
Borland Memory Manager
-
А какую роль играет единоэкземплярность BMM??
-
Выделение и последующее перераспределение или освобождение ранее выделенного или перераспределенного блока памяти долнжо осуществляться одним и тем же экземпляром менеджера.