joshua-r2
10/27/2017 - 6:50 PM

Inheritance Sample 2

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)
        }
    }
}