Delphi - наследовать от класса и интерфейса (шаблон адаптера)? - PullRequest
4 голосов
/ 18 марта 2011

Я пытаюсь создать шаблон адаптера GoF, и в примере C #, которому я следую, класс Adapter наследует исходный класс и интерфейс адаптации.В Delphi (2007), насколько я знаю, это невозможно, или это так?Причина, если класс наследует интерфейс, он должен наследовать от TInterfacedObject, и поскольку Delphi не допускает наследование нескольких классов, это конец истории.Я не могу наследовать от пользовательского класса и интерфейса одновременно.

Правильно ли я?

Спасибо.

Я реализовал этот шаблон на http://delphipatterns.blog.com/2011/02/22/decorator-5/

1 Ответ

14 голосов
/ 18 марта 2011

Нет, это не правильно.Вы можете добавить интерфейс в любой понравившийся вам класс следующим образом:

type
  IAdapter = interface
    procedure DoSomething;
  end;

  TAdapter = class(TBaseClass, IInterface, IAdapter)
  private
    FRefCount: Integer;
    procedure DoSomething;
  protected
    function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;
  end;

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

function TAdapter._AddRef: Integer;
begin
  Result := InterlockedIncrement(FRefCount);
end;

function TAdapter._Release: Integer;
begin
  Result := InterlockedDecrement(FRefCount);
  if Result = 0 then
    Destroy;
end;

procedure TAdapter.DoSomething;
begin
end;
...