package Ġsolid _ pr incip les . interface _ se gregation _ pr incip le . after Ċ Ċ class ĠOut Of Funds Error Ġ: ĠException () Ċ Ċ class ĠP ants Ċ Ċ interface ĠP ants W ear er Ġ{ ĊĠĠĠ Ġval Ġp ants : ĠP ants Ċ } Ċ Ċ class ĠP ants W ear er Impl ( override Ġval Ġp ants : ĠP ants ) Ġ: ĠP ants W ear er Ċ Ċ class ĠSh irt Ċ Ċ interface ĠSh irt W ear er Ġ{ ĊĠĠĠ Ġval Ġsh irt : ĠSh irt Ċ } Ċ Ċ class ĠSh irt W ear er Impl ( override Ġval Ġsh irt : ĠSh irt ) Ġ: ĠSh irt W ear er Ċ Ċ class ĠUnder we ar Ċ Ċ interface ĠUnder we ar W ear er Ġ{ ĊĠĠĠ Ġval Ġunder we ar : ĠUnder we ar Ċ } Ċ Ċ class ĠUnder we ar W ear er Impl ( override Ġval Ġunder we ar : ĠUnder we ar ) Ġ: ĠUnder we ar W ear er Ċ Ċ data Ġclass ĠMoney ( val Ġamount : ĠDouble ) Ċ Ċ interface ĠMoney Handler Ġ{ ĊĠĠĠ Ġfun Ġget Money ( amount : ĠDouble ): ĠList < Money > ĊĊĠĠĠ Ġfun Ġadd Money ( money : ĠIterable < Money >) Ċ } Ċ Ċ class ĠHuman Money Handler ( var arg Ġmoney : ĠMoney ) Ġ: ĠMoney Handler Ġ{ ĊĠĠĠ Ġval Ġmoney Ġ= Ġmoney . to Mutable List () ĊĊĠĠĠ Ġoverride Ġfun Ġget Money ( amount : ĠDouble ): ĠList < Money > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmoney To Give Ġ= Ġmutable ListOf < Money >() ĊĠĠĠĠĠĠĠ Ġvar Ġremaining Amount Ġ= Ġamount ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( m Ġin Ġthis . money . sorted By Descending Ġ{ Ġm Ġ-> Ġm . amount Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( remaining Amount Ġ<= Ġ 0 ) Ġbreak ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmoney To Give . add ( m ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . money . remove ( m ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġremaining Amount Ġ-= Ġm . amount ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( remaining Amount Ġ> Ġ 0 . 0 ) Ġthrow ĠOut Of Funds Error () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmoney To Give ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Money ( money : ĠIterable < Money >) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . money . addAll ( money ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠPerson ( ĊĠĠĠ Ġmoney Handler : ĠMoney Handler , ĊĠĠĠ Ġp ants W ear er : ĠP ants W ear er , ĊĠĠĠ Ġunder we ar W ear er : ĠUnder we ar W ear er , ĊĠĠĠ Ġsh irt W ear er : ĠSh irt W ear er Ċ ) Ġ: ĠMoney Handler Ġby Ġmoney Handler , ĊĠĠĠ ĠP ants W ear er Ġby Ġp ants W ear er , ĊĠĠĠ ĠUnder we ar W ear er Ġby Ġunder we ar W ear er , ĊĠĠĠ ĠSh irt W ear er Ġby Ġsh irt W ear er Ċ Ċ fun Ġpay ( person : ĠMoney Handler , Ġamount : ĠDouble ): ĠList < Money > Ġ{ ĊĠĠĠ Ġreturn Ġperson . get Money ( amount ) Ċ } Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval Ġperson Ġ= ĠPerson ( ĊĠĠĠĠĠĠĠ ĠHuman Money Handler ( Money ( 1 0 . 0 ), ĠMoney ( 1 0 . 0 ), ĠMoney ( 5 . 0 )), ĊĠĠĠĠĠĠĠ ĠP ants W ear er Impl ( P ants ()), ĊĠĠĠĠĠĠĠ ĠUnder we ar W ear er Impl ( Under we ar ()), ĊĠĠĠĠĠĠĠ ĠSh irt W ear er Impl ( Sh irt ()) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġpayment Ġ= Ġpay ( person , Ġ 2 0 . 0 ) ĊĊĠĠĠ Ġprintln ( payment ) Ċ } Ċ