Введение интерфейсов в существующую иерархию классов в Delphi - PullRequest
4 голосов
/ 28 октября 2010

Есть ли какие-либо побочные эффекты при изменении предка иерархии классов с TObject на TInterfacedObject, чтобы я мог реализовать интерфейсы дальше по цепочке наследования?

Я программировал на Delphi в течение нескольких лет, но никогда не сталкивался с интерфейсами. Я привык использовать их на других языках. Теперь, когда я снова участвую в проекте Delphi, я бы хотел воспользоваться ими, но я знаю, что они работают немного иначе, чем в Java или C #.

Ответы [ 3 ]

4 голосов
/ 28 октября 2010

Если у вас уже есть код, использующий класс, вам, вероятно, придется изменить его, чтобы сохранить ссылки на интерфейсы, а не на экземпляры объектов.Интерфейсы подсчитываются и высвобождаются автоматически, в результате любая ссылка на экземпляр разработчика становится недействительным указателем.

3 голосов
/ 28 октября 2010

Это будет работать нормально, если вы наследуете класс ниже в верхней (нижней части?) Вашей иерархии.Этот код гарантирует, что ваши новые классы не освобождают себя - как и поведение TInterfaceObject по умолчанию - вы, вероятно, уже освобождаете их сами и хотите сохранить это.Это действие на самом деле именно то, что делает TComponent в VCL - оно поддерживает интерфейсы, но не подсчитывает ссылки.

type


  TYourAncestor = class( TInterfacedObject )
    function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;

  end;



implementation



function TYourAncestor.QueryInterface(const IID: TGUID; out Obj): HResult;
const
  E_NOINTERFACE = HResult($80004002);
begin
  if GetInterface(IID, Obj) then Result := 0 else Result := E_NOINTERFACE;
end;


function TYourAncestor._AddRef: Integer;
begin
  Result := -1   // -1 indicates no reference counting is taking place
end;

function TYourAncestor._Release: Integer;
begin
  Result := -1   // -1 indicates no reference counting is taking place
end;
1 голос
/ 28 октября 2010

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

...