Делегирование

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Делегирование

Сообщение trifon » 19.10.2007 17:22:44

Кто нибудь может привести хороший пример кода с использованием делегирования, в fpc мануале внятного описания я не нашел, а с дельфи я к сожалению мало знаком.
trifon
постоялец
 
Сообщения: 135
Зарегистрирован: 24.12.2006 12:08:35

Сообщение trifon » 20.10.2007 15:00:57

Нашё тут в сети примеры из дельфи немного переписал, вроде все работает.
Может пригодится кому-то
Код: Выделить всё
{$OBJECTCHECK ON}
{$INTERFACES CORBA}
program delegation_test;

type
IDeclaredOptions = interface
  procedure MetodA;
  procedure MetodB;
end;

TManager = class
private
  FRealization: IDeclaredOptions;
public
  property Realization: IDeclaredOptions read FRealization write FRealization;
end;

TRealization1 = class( IDeclaredOptions)
  procedure MetodA;
  procedure MetodB;
end;

TRealization2 = class( IDeclaredOptions)
  procedure MetodA;
  procedure MetodB;
end;


procedure TRealization1.MetodA;
begin
  writeln('TRealization1.MetodA');
end;

procedure TRealization1.MetodB;
begin
  writeln('TRealization1.MetodB')
end;

procedure TRealization2.MetodA;
begin
  writeln('TRealization2.MetodA')
end;

procedure TRealization2.MetodB;
begin
  writeln('TRealization2.MetodB')
end;

var
  M1, M2 : TManager;
begin
  M1 := TManager.Create;

  M1.Realization := TRealization1.Create;
  M1.Realization.MetodA; M1.Realization.MetodB;

  M1.Realization := TRealization2.Create;
  M1.Realization.MetodA; M1.Realization.MetodB
end.
trifon
постоялец
 
Сообщения: 135
Зарегистрирован: 24.12.2006 12:08:35

Сообщение trifon » 20.10.2007 19:36:05

Наткнулся на интересный пример делегирования в Object Pascal, может тоже кому-то интересно будет
Шаблон_делегирования
trifon
постоялец
 
Сообщения: 135
Зарегистрирован: 24.12.2006 12:08:35

Сообщение trifon » 20.10.2007 19:47:14

Я вот только не совсем понял, какую поддержку добавили в fpc-2.2.0?
Я нашел только TAggregatedObject.
trifon
постоялец
 
Сообщения: 135
Зарегистрирован: 24.12.2006 12:08:35

Сообщение Sergei I. Gorelkin » 22.10.2007 05:55:05

Возможно, речь о ключевом слове implements. Это обсуждали здесь на форуме, когда 2.2.0 только в проекте появился.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Mirage » 22.10.2007 12:20:35

Делегирование это когда один класс использует другой для реализации какой-либо заявленной функциональности. Какой тут пример может быть нужен?

Другое дело, что поддержка этого на уровне синтаксиса (тот самый пресловутый implements) приятна.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Сообщение trifon » 22.10.2007 15:38:38

Переписал с использованием implements, хоть убейте но смысл данного мазохизма мне не понятен.

Код: Выделить всё
program delegation_test;
{$Mode objfpc}
{$OBJECTCHECKS ON}
{$INTERFACES CORBA}

type
IDeclaredOptions = interface
  procedure MetodA;
  function MetodB : Integer;
end;

TManager = class(IDeclaredOptions)
public
  FRealization: IDeclaredOptions;
  property Realization: IDeclaredOptions read FRealization implements IDeclaredOptions;
end;


TRealization1 = class( IDeclaredOptions)
  procedure MetodA;
  function MetodB : Integer;
end;


TRealization2 = class( IDeclaredOptions)
  procedure MetodA;
  function MetodB : Integer;
end;


procedure TRealization1.MetodA;
begin
  writeln('TRealization1.MetodA');
end;

function TRealization1.MetodB : Integer;
begin
  writeln('TRealization1.MetodB')
end;

procedure TRealization2.MetodA;
begin
  writeln('TRealization2.MetodA')
end;

function TRealization2.MetodB : Integer;
begin
  writeln('TRealization2.MetodB')
end;


var
  Mn : TManager;
begin
  Mn := TManager.Create;

  Mn.FRealization := TRealization1.Create;
  Mn.Realization.MetodA; Mn.Realization.MetodB;

  Mn.FRealization := TRealization2.Create;
  Mn.Realization.MetodA; Mn.Realization.MetodB
end.


В чём преимущество перед первым вариантом, если нельзя вызвать Mn.MetodA; ?
При этом TManager должен быть унаследован от IDeclaredOptions, выглядит не логично, только запутывает код и затрудняет его понимание.
trifon
постоялец
 
Сообщения: 135
Зарегистрирован: 24.12.2006 12:08:35

Сообщение Sergei I. Gorelkin » 22.10.2007 16:22:34

Тут нужно переменную Mn объявить типа IDeclaredOptions, а не TManager - тогда можно будет вызывать Mn.MetodA и Mn.MetodB напрямую. Но перестанет работать строка Mn.FRealization := TRealization1.Create. В общем смысле это логично - Realization не должна быть public (см. пример из википедии). Т.е. TManager реализует интерфейс, а _как_ он этот интерфейс реализует - его внутренние проблемы.

С одним интерфейсом оно не слишком показательно, истинный смысл начинает проявляться, когда речь заходит о паре десятков разных интерфейсов.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение trifon » 22.10.2007 17:10:53

О каком wiki речь?
Я нашёл только http://wiki.freepascal.org/Language_related_articles, где сказано что FPC 2.x.x в данный момент не поддерживает "implements style delegation"
Если можете дайте ссылку, а заодно ссылку на то как это в delphi делается.
trifon
постоялец
 
Сообщения: 135
Зарегистрирован: 24.12.2006 12:08:35

Сообщение Sergei I. Gorelkin » 22.10.2007 17:39:19

Я имел в виду Вашу же ссылку из третьего сообщения этой темы.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение trifon » 22.10.2007 18:19:56

Замете, в том примере implements не используется, хотя написано на object pascal(как я понимаю подразумевается дельфи).
Отсюда мораль изобретатели из борланда изобрели что-то, смысл чего им и самим до конца не понятен наверное(разве что деньги вытягивать).
А ведь говорят, что всё гениальное просто.
trifon
постоялец
 
Сообщения: 135
Зарегистрирован: 24.12.2006 12:08:35

Сообщение Sergei I. Gorelkin » 22.10.2007 20:42:29

implements применимо только к интерфейсам, а они в том примере не используются. Впрочем, даже если бы использовались... Дельфи поддерживает только com-интерфейсы, c которыми функциональность implements реализуется элементарным перекрытием метода QueryInterface. Так что все сводится к экономии нескольких строчек. В FPC с его corba-интефейсами этот синтаксис может оказаться более полезным...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru