快学Scala习题解答—第八章 继承

8 继承

8.1 扩展如下的BankAccount类,新类CheckingAccount对每次存款和取款都收取1美元的手续费class BankAccount(initialBalance:Double){

private var balance = initialBalance

def deposit(amount:Double) = { balance += amount; balance}

def withdraw(amount:Double) = {balance -= amount; balance}

}

继承语法的使用。代码如下

Scala代码  

  1. class CheckingAccount(initialBalance:Double) extends BankAccount(initialBalance){
  2. override def deposit(amount: Double): Double = super.deposit(amount - 1)
  3. override def withdraw(amount: Double): Double = super.withdraw(amount + 1)
  4. }

8.2 扩展前一个练习的BankAccount类,新类SavingsAccount每个月都有利息产生(earnMonthlyInterest方法被调用),并且有每月三次免手续费的存款或取款。在earnMonthlyInterest方法中重置交易计数。

Scala代码  

  1. class SavingsAccount(initialBalance:Double) extends BankAccount(initialBalance){
  2. private var num:Int = _
  3. def earnMonthlyInterest()={
  4. num = 3
  5. super.deposit(1)
  6. }
  7. override def deposit(amount: Double): Double = {
  8. num -= 1
  9. if(num < 0) super.deposit(amount - 1) else super.deposit(amount)
  10. }
  11. override def withdraw(amount: Double): Double = {
  12. num -= 1
  13. if (num < 0) super.withdraw(amount + 1) else super.withdraw(amount)
  14. }
  15. }

8.3 翻开你喜欢的Java或C++教科书,一定会找到用来讲解继承层级的实例,可能是员工,宠物,图形或类似的东西。用Scala来实现这个示例。

Thinking in Java中的代码

Java代码  

  1. class Art{
  2. Art(){System.out.println("Art constructor");}
  3. }
  4. class Drawing extends Art{
  5. Drawing() {System.out.println("Drawing constructor");}
  6. }
  7. public class Cartoon extends Drawing{
  8. public Cartoon() { System.out.println("Cartoon constructor");}
  9. }

使用Scala改写如下

Scala代码  

  1. class Art{
  2. println("Art constructor")
  3. }
  4. class Drawing extends Art{
  5. println("Drawing constructor")
  6. }
  7. class Cartoon extends Drawing{
  8. println("Cartoon constructor")
  9. }

8.4 定义一个抽象类Item,加入方法price和description。SimpleItem是一个在构造器中给出价格和描述的物件。利用val可以重写def这个事实。Bundle是一个可以包含其他物件的物件。其价格是打包中所有物件的价格之和。同时提供一个将物件添加到打包当中的机制,以及一个适合的description方法

Scala代码  

  1. import collection.mutable.ArrayBuffer
  2. abstract class Item{
  3. def price():Double
  4. def description():String
  5. override def toString():String={
  6. "description:" + description() + "  price:" + price()
  7. }
  8. }
  9. class SimpleItem(val price:Double,val description:String) extends Item{
  10. }
  11. class Bundle extends Item{
  12. val items = new ArrayBuffer[Item]()
  13. def addItem(item:Item){
  14. items += item
  15. }
  16. def price(): Double = {
  17. var total = 0d
  18. items.foreach(total += _.price())
  19. total
  20. }
  21. def description(): String = {
  22. items.mkString(" ")
  23. }
  24. }

8.5 设计一个Point类,其x和y坐标可以通过构造器提供。提供一个子类LabeledPoint,其构造器接受一个标签值和x,y坐标,比如:new LabeledPoint("Black Thursday",1929,230.07)

Scala代码  

  1. class Point(x:Int,y:Int){
  2. }
  3. class LabeledPoint(label:String,x:Int,y:Int) extends Point(x,y){
  4. }

8.6 定义一个抽象类Shape,一个抽象方法centerPoint,以及该抽象类的子类Rectangle和Circle。为子类提供合适的构造器,并重写centerPoint方法

Scala代码  

  1. abstract class Shape{
  2. def centerPoint()
  3. }
  4. class Rectangle(startX:Int,startY:Int,endX:Int,endY:Int) extends Shape{
  5. def centerPoint() {}
  6. }
  7. class Circle(x:Int,y:Int,radius:Double) extends Shape{
  8. def centerPoint() {}
  9. }

8.7 提供一个Square类,扩展自java.awt.Rectangle并且是三个构造器:一个以给定的端点和宽度构造正方形,一个以(0,0)为端点和给定的宽度构造正方形,一个以(0,0)为端点,0为宽度构造正方形

Scala代码  

  1. import java.awt.{Point, Rectangle}
  2. class Square(point:Point,width:Int) extends Rectangle(point.x,point.y,width,width){
  3. def this(){
  4. this(new Point(0,0),0)
  5. }
  6. def this(width:Int){
  7. this(new Point(0,0),width)
  8. }
  9. }

8.8 编译8.6节中的Person和SecretAgent类并使用javap分析类文件。总共有多少name的getter方法?它们分别取什么值?(提示:可以使用-c和-private选项)

总共两个。Person中取得的是传入的name,而SecretAgent中取得的是默认的"secret"

8.9 在8.10节的Creature类中,将val range替换成一个def。如果你在Ant子类中也用def的话会有什么效果?如果在子类中使用val又会有什么效果?为什么?

在Ant中使用def没有问题。但是如果使用val则无法编译。因为val只能重写不带参数的def。这里的def是带参数的

8.10 文件scala/collection/immutable/Stack.scala包含如下定义:

class Stack[A] protected (protected val elems: List[A])

请解释protected关键字的含义。(提示:回顾我们在第5章中关于私有构造器的讨论)

此构造方法只能被其子类来调用,而不能被外界直接调用

Blog URL:http://www.ivanpig.com/blog/?p=475

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-11 09:55:03

快学Scala习题解答—第八章 继承的相关文章

快学Scala习题解答—第一章 基础

1 简介 近期对Scala比较感兴趣,买了本<快学Scala>,感觉不错.比<Programming Scala:Tackle Multi-Core Complexity on the Java Virtual Machine>好很多. 是本不错的入门书.而且每个章节都设置了难度级别,每章有习题,可以巩固Scala语法. 本文的目的就是针对这些习题进行解答 2 基础 2.1 在Scala REPL中键入3,然后按Tab键.有哪些方法可以被应用? 这个....直接操作一遍就有结果了.

快学Scala习题解答—第三章 数组相关操作

3 数组相关操作 3.1 编写一段代码,将a设置为一个n个随机整数的数组,要求随机数介于0(包含)和n(不包含)之间 random和yield的使用 Scala代码   import scala.math.random def randomArray(n:Int)={ for(i <- 0 until n) yield (random * n).toInt } println(randomArray(10).mkString(",")) 3.2 编写一个循环,将整数数组中相邻的元

快学Scala习题解答—第十一章 操作符

11 操作符 11.1 依据优先级规则,3 + 4 -> 5和3 -> 4 + 5是怎样被求值的? 在REPL中运行就可以得到结果.都是从左至右运行 12.2 BigInt类有一个pow方法,但没实用操作符字符. Scala类库的设计者为什么没有选用**(像Fortran那样)或者^(像Pascal那样)作为乘方操作符呢? Scala中的操作符就是方法.其优先级是依据首字母来推断的,优先级例如以下 最高优先级:除下面字符外的操作符字符 * / % + - : = ! < > &am

快学Scala习题解答—第二章 控制结构和函数

2 控制结构和函数 2.1 一个数字如果为正数,则它的signum为1;如果是负数,则signum为-1;如果为0,则signum为0.编写一个函数来计算这个值 简单的逻辑判断 Scala代码   def signum(num:Int){if(num>0)print(1)else if(num<0)print(-1)else print(0)} Scala中已经有此方法了,刚才查找API的时候,应该能看到 Scala代码   BigInt(10).signum 2.2 一个空的块表达式{}的值

快学scala习题解答--第五章 类

5 类 5.1 改进5.1节的Counter类,让它不要在Int.MaxValue时变成负数 Scala代码   class Count{ private var value = Int.MaxValue def increment(){if(value < Int.MaxValue) value + 1 else value } def current = value } 5.2 编写一个BankAccount类,加入deposit和withdraw方法,和一个只读的balance属性 Sca

快学Scala习题解答—第四章 映射和元组

4 映射和元组 4.1 设置一个映射,其中包含你想要的一些装备,以及它们的价格.然后构建另一个映射,采用同一组键,但是价格上打9折 映射的简单操作 Shell代码   scala> val map = Map("book"->10,"gun"->18,"ipad"->1000) map: scala.collection.immutable.Map[java.lang.String,Int] = Map(book ->

快学Scala课后习题答案

分享一个之前做快学Scala的课后习题(2-21章节,19无)的Github链接,我把习题的文字写在了每个回答的注释上面,这样方便大家对照着看,省的回过头去对照着pdf看了,如果有做的不对的地方希望大家给予指正. 链接如下,http://github.com/fxxkinglife/scala-hello. 举一个第二章节的例子, object charpter02 { /* * 2.1 * 一个数字如果为正数,则它的signum为1; * 如果是负数,则signum为-1; * 如果为0,则s

快学scala 第十一章 操作符 读书笔记及习题答案代码

chapter 11 操作符 标签:快学scala 一.笔记 scala种可以在反引号中包含几乎任何字符序列, val 'val' = 42 所有的操作符都是左结合的,除了以冒号(:)结尾的操作符,和赋值操作符.用于构造列表的::操作符是又结合的.1::2::Ni1的意思是1::(2::Ni1),先创建出包含2的列表,这个列表又被作为尾巴拼接到以1作为头部的列表中. 2. 函数调用语法:f(arg1, arg2,...)扩展到可以应用于函数之外的值,如果f不是函数或方法,那么这个表达式等于f.a

快学scala笔记.

第一章 基础 val 定义的值实际上是一个常量 var 声明其值可变的变量 val xmax,ymax = 100 var greeting,message: String = null 1.3 常用类型 Scala的7种数值类型:Byte.Char.Short.Int.Long.Float和Double 1.toString() 2.to(10) "Hello".intersect("World") 1.4 算术和操作符重载 val answer = 8 * 5