package Ġnon _ test . kotlin _ playground ĊĊ Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠ Ġval Ġservice Ġ= Ġnew Service (" my TestId ") ĊĊĠĠĠ Ġprintln ("> > Ġmain : Ġadd Listener .") ĊĠĠĠ Ġservice . addListener Ġ{ Ġprintln (" event Ġcaught : Ġ$ it ") Ġ} ĊĠĠĠ Ġprintln ("> > Ġmain : Ġservice Ġexecute .") ĊĠĠĠ Ġservice . execute () ĊĊĠĠĠ Ġ// ĠNOT ĠVIS IBLE Ġto Ġthe Ġoutside Ġworld Ġ:) Ġservice . id Not VisibleTo Outside World ĊĠĠĠ Ġprintln ("> > Ġmain : Ġprint Id .") ĊĠĠĠ Ġservice . print Id () Ċ } ĊĊĊĊ Ċ fun Ġnew Service ( my Id : ĠString ): ĠService Ġ{ ĊĠĠĠ Ġ// Ġid Not VisibleTo Outside World Ġis Ġro uted Ġtwo Ġtimes , Ġyes Ġ:- / ĊĠĠĠ Ġreturn ĠMy Service ( my Id , ĠDefault Observable (), Ġobject Ġ: ĠDefault Id Print able () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġid Not VisibleTo Outside World Ġ= Ġmy Id ĊĠĠĠ Ġ}) Ċ } Ċ Ċ data Ġclass ĠEvent ( val Ġmessage : ĠString ) Ċ Ċ // Ġtwo Ġinterfaces Ġimplemented Ġby Ġdeleg ation Ġfeature Ċ interface ĠService Ġ: ĠObservable , ĠId Print able Ġ{ ĊĠĠĠ Ġfun Ġexecute () Ċ } Ċ Ċ interface ĠObservable Ġ{ ĊĠĠĠ Ġfun Ġadd Listener ( listener : Ġ( Event ) Ġ-> ĠUnit ) Ċ } Ċ Ċ interface ĠId Print able Ġ{ ĊĠĠĠ Ġfun Ġprint Id () Ċ } ĊĊĊ Ċ private Ġclass ĠMy Service ( override Ġval Ġid Not VisibleTo Outside World : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġobservable : ĠDefault Observable , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġid Print able : ĠId Print able Ċ Ċ ) Ġ: ĠService , ĠHas Id , ĊĠĠĠĠĠĠĠ Ġ// Ġthis Ġdoes Ġthe Ġtrick ! Ġ=) ĊĠĠĠĠĠĠĠ ĠObservable Ġby Ġobservable , ĠId Print able Ġby Ġid Print able Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġexecute () Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" My Service . execute () ") ĊĠĠĠĠĠĠĠ Ġobservable ._ dispatch ( Event (" executed ")) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġopen Ġclass ĠDefault Observable Ġ: ĠObservable Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlisteners Ġ= Ġmutable ListOf <( Event ) Ġ-> ĠUnit >() ĊĊĠĠĠ Ġoverride Ġfun Ġadd Listener ( listener : Ġ( Event ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Default Observable . addListener () ") ĊĠĠĠĠĠĠĠ Ġlisteners . add ( listener ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġ_ dispatch ( event : ĠEvent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Default Observable ._ dispatch () ") ĊĠĠĠĠĠĠĠ Ġlisteners . forEach Ġ{ Ġit . invoke ( event ) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ // Ġinternal Ġinterface Ċ private Ġinterface ĠHas Id Ġ{ ĊĠĠĠ Ġval Ġid Not VisibleTo Outside World : ĠString Ċ } Ċ private Ġabstract Ġclass ĠDefault Id Print able Ġ: ĠId Print able , ĠHas Id Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġprint Id () Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Default Id Print able . print Id () Ġ... ĠID Ġ= Ġ'${ this . id Not VisibleTo Outside World }' ") ĊĠĠĠ Ġ} Ċ Ċ } Ċ