/* Ċ Ġ* ĠĠĠ ĠCopyright Ġ 2 0 1 8 ĠM ak oto ĠConsult ing ĠGroup ĠInc Ċ Ġ* Ċ Ġ* ĠĠĠ ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* ĠĠĠ Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠĠĠ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠĠĠ ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* ĠĠĠ Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠĠĠ ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠĠĠ ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* ĠĠĠ Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ* Ċ Ġ*/ Ċ Ċ package Ġcom . mak ot ogo . learn . kotlin Ċ Ċ import Ġcom . mak ot ogo . learn . kotlin . model . Human Ċ import Ġcom . mak ot ogo . learn . kotlin . model . Ident ifiable Ċ import Ġcom . mak ot ogo . learn . kotlin . model . Person Ċ import Ġcom . mak ot ogo . learn . kotlin . util . generate Random Date OfBirth Ċ import Ġcom . mak ot ogo . learn . kotlin . util . generate Random Family Name Ċ import Ġcom . mak ot ogo . learn . kotlin . util . generate Random Given Name Ċ import Ġjava . time . LocalDate Ċ import Ġjava . time . LocalDateTime Ċ Ċ /** Ċ Ġ* ĠCreate Ġand Ġreturn Ġa Ġ[ Human ] Ġobject Ċ Ġ* ĠIt Ġis Ġalso Ġ[ Ident ifiable ], Ġbut Ġthe ĠJVM Ġonly Ġsupports Ċ Ġ* Ġone Ġreturn Ġtype Ġso ĠI Ġhad Ġto Ġpick Ġone . Ċ Ġ*/ Ċ fun Ġcreate Ident ifiable Human (): ĠHuman Ġ{ ĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĠCreate Ġan Ġanonymous Ġinner Ġclass Ġimplementation Ġof ĊĠĠĠ Ġ// Ġthe ĠHuman Ġand ĠIdent ifiable Ġinterfaces ĊĠĠĠ Ġ// Ġ( Yes , ĠKotlin Ġwill Ġlet Ġyou Ġimplement Ġmultiple Ġinterfaces ĊĠĠĠ Ġ// Ġanonymous ly !) ĊĠĠĠ Ġreturn Ġobject Ġ: ĠHuman , ĠIdent ifiable Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠOverride Ġabstract Ġproperty Ġwith Ġan Ġinitializer ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġdate OfBirth : ĠLocalDate Ġ= Ġgenerate Random Date OfBirth () ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠOverride Ġabstract Ġproperty Ġidentity ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġidentity : ĠString Ġ= Ġ"${ date OfBirth . to Epoch Day () }" ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠtoString () Ġoverride ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" Human , Ident ifiable ( date OfBirth =$ date OfBirth , Ġidentity =$ identity )" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCreate Ġand Ġreturn Ġan Ġ[ Ident ifiable ] Ġobject . Ċ Ġ* ĠIt Ġis Ġalso Ġ[ Human ]. Ċ Ġ*/ Ċ fun Ġcreate Ident ifiable (): ĠIdent ifiable ? Ġ{ ĊĠĠĠ Ġreturn Ġcreate Ident ifiable Human () Ġas ? ĠIdent ifiable Ċ } Ċ Ċ /** Ċ Ġ* ĠCreate Ġand Ġreturn Ġa Ġ[ Person ] Ġobject Ġfilled Ġwith Ċ Ġ* Ġrandom Ġdata . Ċ Ġ*/ Ċ fun Ġcreate Person (): ĠPerson Ġ{ ĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĠCreate Ġan Ġanonymous Ġinner Ġclass Ġimplementation Ġof ĊĠĠĠ Ġ// Ġthe ĠPerson Ġabstract Ġclass ĊĠĠĠ Ġreturn Ġobject Ġ: ĠPerson ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfamily Name Ġ= Ġgenerate Random Family Name (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgiven Name Ġ= Ġgenerate Random Given Name (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdate OfBirth Ġ= Ġgenerate Random Date OfBirth ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠOverride Ġabstract Ġproperty Ġidentity ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġidentity : ĠString Ġ= Ġ"$ family Name Ġ$ given Name " ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠOverride Ġabstract Ġproperty Ġwith Ġan Ġinitializer ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġwhen Created : ĠLocalDateTime Ġ= ĠLocalDateTime . now () ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠtoString () Ġoverride ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" Person ( family Name =$ family Name , Ġgiven Name =$ given Name , Ġdate OfBirth =$ date OfBirth , Ġwhen Created =$ when Created , Ġidentity =$ identity )" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠThe Ġub i quit ous Ġmain () Ġfunction . ĠWe Ġmeet Ġagain . Ċ Ġ*/ Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĠCreate Ġa ĠHuman Ġ( also ĠIdent ifiable ) ĊĠĠĠ Ġval Ġhuman Ġ= Ġcreate Ident ifiable Human () ĊĠĠĠ Ġprintln (" Human : Ġ$ human ") ĊĠĠĠ Ġ// ĊĠĠĠ Ġ// Ġor Ċ // ĠĠĠ Ġval Ġident ifiable Ġ= Ġcreate Ident ifiable Human () Ġas ĠIdent ifiable Ċ // ĠĠĠ Ġprintln (" Ident ifiable : Ġ$ ident ifiable ") ĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĠNow Ġ( unsafe ) Ġcast Ġto ĠIdent ifiable ĊĠĠĠ Ġval Ġident ifiable Ġ= Ġcreate Ident ifiable () ĊĠĠĠ Ġprintln (" Ident ifiable : Ġ$ ident ifiable ") ĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĠCreate Ġa ĠPerson Ġobject ĊĠĠĠ Ġval Ġperson Ġ= Ġcreate Person () ĊĠĠĠ Ġprintln (" Person : Ġ$ person ") Ċ }