Делегирование
Модератор: Модераторы
Делегирование
Кто нибудь может привести хороший пример кода с использованием делегирования, в fpc мануале внятного описания я не нашел, а с дельфи я к сожалению мало знаком.
Нашё тут в сети примеры из дельфи немного переписал, вроде все работает.
Может пригодится кому-то
Может пригодится кому-то
Код: Выделить всё
{$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.Наткнулся на интересный пример делегирования в Object Pascal, может тоже кому-то интересно будет
Шаблон_делегирования
Шаблон_делегирования
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
Переписал с использованием implements, хоть убейте но смысл данного мазохизма мне не понятен.
В чём преимущество перед первым вариантом, если нельзя вызвать Mn.MetodA; ?
При этом TManager должен быть унаследован от IDeclaredOptions, выглядит не логично, только запутывает код и затрудняет его понимание.
Код: Выделить всё
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, выглядит не логично, только запутывает код и затрудняет его понимание.
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
Тут нужно переменную Mn объявить типа IDeclaredOptions, а не TManager - тогда можно будет вызывать Mn.MetodA и Mn.MetodB напрямую. Но перестанет работать строка Mn.FRealization := TRealization1.Create. В общем смысле это логично - Realization не должна быть public (см. пример из википедии). Т.е. TManager реализует интерфейс, а _как_ он этот интерфейс реализует - его внутренние проблемы.
С одним интерфейсом оно не слишком показательно, истинный смысл начинает проявляться, когда речь заходит о паре десятков разных интерфейсов.
С одним интерфейсом оно не слишком показательно, истинный смысл начинает проявляться, когда речь заходит о паре десятков разных интерфейсов.
О каком wiki речь?
Я нашёл только http://wiki.freepascal.org/Language_related_articles, где сказано что FPC 2.x.x в данный момент не поддерживает "implements style delegation"
Если можете дайте ссылку, а заодно ссылку на то как это в delphi делается.
Я нашёл только http://wiki.freepascal.org/Language_related_articles, где сказано что FPC 2.x.x в данный момент не поддерживает "implements style delegation"
Если можете дайте ссылку, а заодно ссылку на то как это в delphi делается.
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
implements применимо только к интерфейсам, а они в том примере не используются. Впрочем, даже если бы использовались... Дельфи поддерживает только com-интерфейсы, c которыми функциональность implements реализуется элементарным перекрытием метода QueryInterface. Так что все сводится к экономии нескольких строчек. В FPC с его corba-интефейсами этот синтаксис может оказаться более полезным...
