Bank accoutn example worked out
fun main(args: Array<String>){
val JoeSavings = SavingsAccount(0.5)
JoeSavings.deposit(1000.0)
val BobbySchmurdaChecking = CheckingAccount(100.0)
JoeSavings.transfer(150.0, BobbySchmurdaChecking)
BobbySchmurdaChecking.withdraw(10.0)
BobbySchmurdaChecking.withdraw(40.0)
BobbySchmurdaChecking.withdraw(100.0)
BobbySchmurdaChecking.withdraw(20.0)
println("Bobby schmurda got $${BobbySchmurdaChecking.balance} with ${BobbySchmurdaChecking.transactionCount} transfers")
println("Joe got $${JoeSavings.balance}")
}
open class BankAccount( var balance: Double)
{
//Calling default constructor and setting to 0
constructor(): this(0.0)
open fun deposit(amount:Double)
{
balance = balance+amount
}
open fun withdraw(amount: Double)
{
balance=balance-amount
}
fun transfer(amount: Double, accountTo: BankAccount)
{
withdraw(amount)
accountTo.deposit(amount)
}
}
class SavingsAccount(var interestRate: Double): BankAccount()
{
fun addInterest()
{
val interest = balance* interestRate/100
deposit(interest)
}
}
class CheckingAccount(var initialBalance: Double):BankAccount(initialBalance)
{
var transactionCount = 0
companion object {
private val FREE_TRANSACTIONS=3
private val TRANSACTION_FEE = 2.0
}
//Don't want to duplicate adding money, hence calling super, which reuses code
override fun deposit(amount: Double) {
transactionCount++
super.deposit(amount)
}
override fun withdraw(amount: Double) {
transactionCount++
super.withdraw(amount)
}
fun deductFees()
{
if (transactionCount> FREE_TRANSACTIONS){
val fees = TRANSACTION_FEE * (transactionCount - FREE_TRANSACTIONS)
super.withdraw(fees)
}
}
}