У меня совсем нет опыта работы с интерфейсами в Delphi и Delphi.
Пример:
IListModel = interface
function At(row, col : Integer) : String;
end;
MyModel = class(TInterfacedObject, IListModel)
public
function At(row, col : Integer) : String;
procedure ManipulateA;
procedure ManipulateBogus;
end;
Существует представление, которое может визуализировать объекты, которые реализуют интерфейс IListModel.
View = class(TForm)
public
constructor Create(model : IListModel); reintroduce;
end;
Мое приложение содержит экземпляр MyModel
MyApp = class({...})
strict private
model : MyModel;
public
// ...
end;
В приложении я создаю модель и работаю с ней.
procedure MyApp.LoadModel;
procedure MyApp.OnFoo;
begin
model.ManipulateBogus;
end;
Теперь я хочупоказать данные
procedure MyApp.ShowModel;
var
v : View;
begin
v := View.Create(model); // implicit to IListView > refCount=1
v.ShowModal;
FreeAndNil(v);
// refCount = 0
// oops, my model is dead now
end;
Мне интересно, как лучше решить эту проблему.В MyApp я мог бы держать оба, модель экземпляра: MyModel И через интерфейс IListModel.Или я мог бы представить новый интерфейс IMyModel и держать модель этим интерфейсом в классе MyApp.Мне пришлось использовать, если Supports (...) в методе ShowModel, чтобы получить интерфейс IListModel.Или я извлекаю класс MyModel из другого базового класса без пересчета (TInterfacedPersistent или самописный класс).Любые другие идеи?
Каков наилучший способ работы с интерфейсами в таких ситуациях?
Редактировать: Базовый класс без учета подсчета:
function NonRefCountingObject.QueryInterface(const IID: TGUID;
out Obj): HResult;
begin
if GetInterface(IID, Obj) then
Result := S_OK
else
Result := E_NOINTERFACE;
end;
function NonRefCountingObject._AddRef: Integer;
begin
Result := -1; // no reference counting
end;
function NonRefCountingObject._Release: Integer;
begin
Result := -1; // no reference counting
end;
Является ли эта реализацияок?