您的位置:首页 > 编程语言

快学scala 第6章 对象 读书笔记及习题答案代码

2016-07-21 14:05 393 查看


chapter 6 对象

标签:快学scala


一、笔记

如果一个对象从未被使用,那么其构造器也不会被执行。对象本质上可以拥有类的所有特性,它甚至可以扩展其他类或特质。但不能提供构造器参数。

java中通常用到既有实例方法又有静态方法的类,scala中可以通过类与类同名的“伴生”对象来达到同样目的。类与其伴生对象可以互相访问私有特性,必须在同一源文件中。
一个apply方法返回伴生类的对象。Array(100)调用apply(100),输出一个单元素(整数100)的Array[Int]; new Array(100)调用的是构造器this(100),结果时Array[Nothing],包含100个null元素。

class Account private(val id: Int, initialBalance: Double){

private var balance = initialBalance

...

}

object Account{  //伴生对象

def apply(initialBalance: Double) = {

new Account(newUniqueNumber(), initialBalance)

    ...

}

}

val acct = Account(1000, 0)      //调用,构造账户

[/code]

应用程序对象,扩展App特质,加入命令行参数判断

object Hello extends App{

if(args.length > 0)

println("Hello, " + args(0))

else

println("Hello , world !")

}

$ scala -Dscala.time Hello Fread

Hello, Fread

[total 2ms]               //显示运行时间

[/code]

scala标准库一个Enumeration助手类,用于产生枚举。

object TrafficLightColor extends Enumeration{

val Red, Yellow, Green = Value

}

[/code]


二、习题答案

6.1 编写一个 Conversions 对象,加入 inchesToCentimeters,gallonsToLiters 和 milesToKilometers 方法

object Conversions{

def inchesToCentimeters(value: Double)={ value * 2.54}

def gallonsToLiters(value: Double)= {value * 3.785411}

def milesToKilometers(value: Double){value * 1.609344}

}

[/code]

6.2 前一个练习不是很面向对象。提供一个通用的超类 UnitConversion并定义扩展该超类的 InchesToCentimeters,GallonsToLiters 和 MilesToKilometers 对象

class UnitConversion(val factor: Double){

def convert(value: Double): Double = factor * value

}

object InchesToSantimeters extends UnitConversion(2.54)

object GallonsToLiters extends UnitConversion(3.78541178)

object MilesToKilometers extends UnitConversion(1.609344)


val temperate = InchesToSantimeters(30.0)  //调用伴生对象

[/code]

6.3 定义一个扩展自 java.awt.Point 的 Origin对象。为什么说这实际上不是个好主意?(仔细看 Point 类的方法)Point 中的 getLocation 方法返回的是 Point 对象,如果想返回 Origin 对象,需要 Origin 类才行

import java.awt.Point


object Origin extends Point with App{

override def getLocation: Point = super.getLocation

Origin.move(2,3)

println(Origin.toString)

}

[/code]

6.4 定义一个 Point 类和一个伴生对象,使得我们可以不用 new 而直接用 Point(3,4)来构造 Point 实例 apply 方法的使用

class Point(x:Int,y:Int){

override def toString():String = "x = "+x +" y =" +y

}

object Point extends App{

def apply(x: Int, y: Int) = new Point(x,y)

val p = Point(1,2)

println(p)

}

[/code]

6.5 编写一个 Scala 应用程序,使用 App 特质,以反序打印命令行参数,用空格隔开。举例来说,scala Reverse Hello World 应该打印 World Hello

object Reverse extends App{

println(args.reverse.mkString(" "))

}

[/code]

6.6 编写一个扑克牌 4 种花色的枚举,让其 toString 方法分别返回♣,♦,♥,♠

object Suits extends Enumeration{

type Suits = Value

val Spade = Value("♠")

val Club = Value("♣")

val Heart = Value("♥")

val Diamond = Value("♦")

override def toString():String={

Suits.values.mkString(",")

    }

}

println(Suits.Club)

println(Suits)

[/code]

6.7 实现一个函数,检查某张牌的花色是否为红色

object suits extends Enumeration with App{

type suits = Value

val Spade = Value("♠")

val Club = Value("♣")

val Heart = Value("♥")

val Diamond = Value("♦")

def isRed(card: suits) = card == Heart || card == Diamond

isRed(suits.Club)

println(isRed(suits.Club))

}

[/code]

6.8 编写一个枚举,描述 RGB 立方体的 8 个角。ID 使用颜色值(例如 :红色是 0xff0000)

object RGBCube extends Enumeration {

val black = Value(0x000000, "Black")

val red = Value(0xff0000, "Red")

val green = Value(0x00ff00, "Green")

val blue = Value(0x0000ff, "Blue")

val yellow = Value(0xffff00, "Yellow")

val magenta = Value(0xff00ff, "Magenta")

val cyan = Value(0x00ffff, "Cyan")

val white = Value(0xffffff, "White")

}

for( c <- RGBCube.values ) println("0x%06x: %s".format(c.id, c))

[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  scala