- Код: Выделить всё
- program Project1;
 uses
 Classes;
 Type
 { TItem }
 TItem = Class
 ID: Integer;
 Caption: String;
 End;
 Type FVisitor = Procedure (Const aItem: TItem);
 Type
 { TContainer }
 TContainer = Class
 Private
 bList: TThreadList;
 Public
 Function AddItem(Const aID: Integer; Const aCaption: String): TItem;
 Procedure Accept(Const aVisitor: FVisitor);
 Constructor Build;
 End;
 { TContainer }
 Function TContainer.AddItem(Const aID: Integer; Const aCaption: String): TItem;
 Begin
 Result := TItem.Create;
 Result.ID := aID;
 Result.Caption := aCaption;
 bList.Add(Result);
 End;
 Procedure TContainer.Accept(Const aVisitor: FVisitor);
 Var
 i: Integer;
 Begin
 With bList.LockList Do
 Try
 For i := 0 To Count - 1 Do
 aVisitor(TItem(Items[i]));
 Finally
 bList.UnlockList;
 End;
 End;
 Constructor TContainer.Build;
 Begin
 bList := TThreadList.Create;
 End;
И чтобы воспользоваться методом Accept приходится делать что-то вроде
- Код: Выделить всё
- Procedure StupidVisitor(Const aItem: TItem);
 Begin
 WriteLn(aItem.ID, #32, aItem.Caption);
 End;
 Var
 aContainer: TContainer;
 Begin
 aContainer := TContainer.Build;
 aContainer.AddItem(1, 'Hello');
 aContainer.AddItem(2, 'World');
 aContainer.Accept(@StupidVisitor);
 End.
а хочется
- Код: Выделить всё
- Var
 aContainer: TContainer;
 Begin
 aContainer := TContainer.Build;
 aContainer.AddItem(1, 'Hello');
 aContainer.AddItem(2, 'World');
 aContainer.Accept(Procedure (Const aItem: TItem)
 Begin
 WriteLn(aItem.ID, #32, aItem.Caption);
 End;
 );
 End.
Такое возможно?




