//--------- file Bottles.dpr ---------- program Bottles; {$APPTYPE CONSOLE} uses SysUtils, Singers in 'Singers.pas'; var Singer: ISinger ; begin Singer := TBottlesSinger.Create ; While Singer.CanSing do WriteLn(Singer.Sing) ; FreeAndNil(Singer) ; end. //end of file Bottles.dpr //--------- file Singers.pas ---------- unit Singers; interface uses SysUtils, Classes; type ISinger = interface(IUnknown) function Sing: String ; function CanSing: boolean ; end ; TAbstractSinger = class(TInterfacedObject,ISinger) private FLine: String ; FCanSing: boolean ; function GetLine: String ; virtual ; procedure SetLine(aLine: String) ; virtual ; public function CanSing: boolean ; virtual ; property Line: String read GetLine write SetLine ; function Sing: String ; virtual ; abstract ; end ; TBottlesSinger = class(TAbstractSinger