Страница 1 из 1

Анонимные функции

СообщениеДобавлено: 23.08.2012 10:25:45
Brainenjii
бывают? Т.е. хочется есть что-то вроде такого:
Код: Выделить всё
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.

Такое возможно?

Re: Анонимные функции

СообщениеДобавлено: 23.08.2012 15:26:00
AlexVinS
Так только в Дельфи можно.