type
//events are built into the language:
//a method pointer type
TGameStartedEvent = procedure(
const AName: string) of object;
TGame = class
private
FName: string;
public
OnStarted: TGameStartedEvent;
constructor Create(const AName: string);
procedure Start;
end;
TStatistic = class
public
StartsCount: Integer;
LastGame: string;
procedure GameStarted(const AName: string);
end;
constructor TGame.Create(const AName: string);
begin
FName := AName;
end;
procedure TGame.Start;
begin
if Assigned(OnStarted) then
OnStarted(FName);
end;
procedure TStatistic.GameStarted(
const AName: string);
begin
Inc(StartsCount);
LastGame := AName;
end;
var
Statistic: TStatistic;
Heroes, Doom: TGame;
begin
Statistic := TStatistic.Create;
Heroes := TGame.Create('Heroes');
Doom := TGame.Create('Doom');
//subscribe to events
Heroes.OnStarted := Statistic.GameStarted;
Doom.OnStarted := Statistic.GameStarted;
Doom.Start;
Heroes.Start;
//statistic.LastGame is 'Heroes'
//statistic.StartsCount is 2
WriteLn('lastGame is ', Statistic.LastGame);
WriteLn('startsCount is ',
Statistic.StartsCount);
end.