《快学Scala》课后习题答案 Unit 8 继承

8.1 扩展如下的BankAccount 类,新类CheckingAccount对每次存款和取款都收取1美元的手续费
class BankAccount(initialBalance: Double) {
  var balance = initialBalance
  def deposit(amount: Double): Double = { balance += amount; balance }
  def withdraw(amount: Double): Double = { balance -= amount; balance}
}

class CheckingAccount(initialBalance: Double) extends BankAccount(initialBalance) {
  override def deposit(amount: Double): Double = super.deposit(1)
  override def withdraw(amount: Double): Double = super.withdraw(1)
}
8.2 扩展前一个练习的BankAccount类,新类SavingsAccount每个月都有利息产生(earnMonthlyInterest方法被调用),并且有每月三次免手续费的存款或取款。在earnMonthlyInterest方法中重置交易计数。
//10为手续费,0.1为利息
class SavingsAccout(initialBalance: Double) extends BankAccount(initialBalance: Double) {
  var num = 0
  def earnMonthlyInterest(): Unit = {
    num = 3
    super.deposit(balance * 0.1)
  }
  override def deposit(amount: Double): Double = {
    num -= 1
    if (num < 0) {
      super.deposit(amount)
      super.withdraw(10)
    }
    balance
  }
  override def withdraw(amount: Double): Double = {
    num -= 1
    if (num < 0) {
      super.withdraw(amount)
      super.withdraw(10)
    }
    balance
  }
}
8.3 翻开你喜欢的Java或C++教科书,一定会找到用来讲解继承层级的实例,可能是员工,宠物,图形或类似的东西。用Scala来实现这个示例。
8.4 定义一个抽象类Item,加入方法price和description。SimpleItem是一个在构造器中给出价格和描述的物件。利用val可以重写def这个事实。Bundle是一个可以包含其他物件的物件。其价格是打包中所有物件的价格之和。同时提供一个将物件添加到打包当中的机制,以及一个适合的description方法
import scala.collection.mutable.ArrayBuffer
abstract class Item {
  def price: Double
  def description: String
}
/***注意这里主构造器直接用val重写了def***/
class SimpleItem(val price: Double, val description: String) extends Item {

}

class Bundle extends Item {
  var items = new ArrayBuffer[Item]()

  def additem (it: Item): Unit = {
    items += it
  }

  def price: Double = {
    var sum = 0.0
    for (x <- items) sum += x.price
    sum
  }

  def description: String = items.mkString(" ")
}
8.5 设计一个Point类,其x和y坐标可以通过构造器提供。提供一个子类LabeledPoint,其构造器接受一个标签值和x,y坐标,比如:new LabeledPoint(“Black Thursday”,1929,230)
class Point(val x: Int, val y: Int) {
  override def toString: String = "(" + x + " , " + y + ")"
}
/***
1. 注意此处x,y没有加val,因为调用了超类的构造器,否则就是重写val,会出错。
2. 子类自己的字段label要加val。
3. 注意x, y的类型要一致,2个类的类型必须一致
***/
class LabeledPoint(val label: String, x: Int, y: Int) extends Point(x, y) {
  override def toString: String = {
    label + ": " + super.toString
  }
}
val x = new LabeledPoint("Black Monday", 1929, 230)     //x: LabeledPoint = Black Monday: (1929 , 230)
8.6 定义一个抽象类Shape,一个抽象方法centerPoint,以及该抽象类的子类Rectangle和Circle。为子类提供合适的构造器,并重写centerPoint方法
abstract class Shape {
  def centerPoint: Point
}

class Circle(val centerPoint: Point, val radius: Int) extends Shape {
  override def toString: String = centerPoint.toString + "r = " + radius
}

val s = new Circle(new Point(1, 2), 3)      //s: Circle = (1 , 2)r = 3
8.7 提供一个Square类,扩展自java.awt.Rectangle并且是三个构造器:一个以给定的端点和宽度构造正方形,一个以(0,0)为端点和给定的宽度构造正方形,一个以(0,0)为端点,0为宽度构造正方形
import java.awt.Rectangle
/***这里主构造器就是以给定的端点和宽度构造正方形***/
class Square(p: Point, width: Int) extends Rectangle(p.x, p.y, width, width) {
  def this() {
    this(new Point(0, 0), 0)
  }
  def this(width: Int) {
    this(new Point(0, 0), width)
  }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值