- Код: Выделить всё
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.
Такое возможно?