快学Scala 第6章 对象 - 练习

1. 编写一个Conversions对象,加入inchesToCentimeters、gallonsToLiters和milesToKilometers方法。

object  Conversions {
     def  main(args :  Array[String]){
         printf( "1 inch = %g centimeters\n" , inchesToCentimeters( 1 ))
         printf( "2 gallons = %g liters\n" , gallonsToLiters( 2 ))
         printf( "3 miles = %g centimeters\n" , milesToKilometers( 3 ))
     }
     def  inchesToCentimeters(inches : Double) = {
         inches *  2.54
     }
     def  gallonsToLiters(gallons : Double) = {
         gallons *  3.7854118
     }
     def  milesToKilometers(miles : Double) = {
         miles *  1.609344 
     }
}
 
/*result
1 inch = 2.54000 centimeters
2 gallons = 7.57082 liters
3 miles = 4.82803 centimeters
*/
 
2. 前一个练习不是很面向对象。提供一个通用的超类UnitConversions并定义扩展该超类的inchesToCentimeters、gallonsToLiters和milesToKilometers对象。
abstract  class  UnitConversions{
     def  convert(amt : Double) :  Double
}
 
object  inchesToCentimeters  extends  UnitConversions{
     override  def  convert(amt : Double) =  amt *  2.54  
}
object  gallonsToLiters  extends  UnitConversions{
     override  def  convert(amt : Double) =  amt *  3.7854118 
}
object  milesToKilometers  extends  UnitConversions{
     override  def  convert(amt : Double) =  amt *  1.609344 
}
 
printf( "1 inch = %g centimeters\n" , inchesToCentimeters.convert( 1 ))
printf( "2 gallons = %g liters\n" , gallonsToLiters.convert( 2 ))
printf( "3 miles = %g centimeters\n" , milesToKilometers.convert( 3 ))
 
/*result
1 inch = 2.54000 centimeters
2 gallons = 7.57082 liters
3 miles = 4.82803 centimeters
*/
 
3. 定义一个扩展自java.awt.Point的Origin对象。为什么说这实际上不是个好主意?(仔细看Point类的方法。)
 
Point类中的getLocation方法返回的是Point对象,如果想返回Origin对象,需要Origin类才行。
import  java.awt. _
 
object  Origin  extends  Point{
     override  def  getLocation : Point  =  super .getLocation
}
 
Origin.move( 2 , 3 )
println(Origin.toString)
 
/*result
Main$$anon$1$Origin$[x=2,y=3]
*/
 
4.   定义一个Point类和一个伴生对象,使得我们可以不用new而直接用Point(3, 4)来构造Point实例。
class  Point  private ( val  x : Int,  val  y : Int){
     override  def  toString  =  "Point at [x=%d,y=%d]" .format(x,y)
}
 
object  Point{
     def  apply(x : Int, y : Int)  =  new  Point(x,y)
}
 
val  =  Point( 3 , 4 )
println(a.toString)
 
/*result
Point at [x=3,y=4]
*/
 
5. 编写一个Scala应用程序,使用App特质,以反序打印命令行参数,用空格隔开。举例来说,scala Reverse Hello World应该打印出World Hello。
object  Reverse{
     def  main(args : Array[String]){
         for (i <- ( 0  until args.length).reverse) print(args(i) +  " " )
     }
}
/* The following code did not work for me. 
object Reverse extends App{
     for(i <- (0 until args.length).reverse) print(args(i) + " ")
}
*/
 
/*result
World Hello
*/
 
6. 编写一个扑克牌4种花色的枚举,让其toString方法分别返回♠♥♦或♣。
object  Poker  extends  Enumeration  with  App{
     val  Heart  =  Value( 3 "" )
     val  Diamond  =  Value( 4 "" )
     val  Club  =  Value( 5 "" )
     val  Spade  =  Value( 6 "" )
     
     
     println(Poker.Heart)
     println(Poker.Diamond)
     println(Poker.Club)
     println(Poker.Spade)
 
}
 
7. 实现一个函数,检查某张牌的花色是否为红色。
object  Card  extends  Enumeration  with  App{
     val  Heart  =  Value( 3 "" )
     val  Diamond  =  Value( 4 "" )
     val  Club  =  Value( 5 "" )
     val  Spade  =  Value( 6 "" )
     
     def  color(c :  Card.Value){
         if (c  ==  Card.Club || c  ==  Card.Spade) print( "Black" )
         else  print( "Red" )
     }
 
     color(Card.Heart)
}
 
/*
Red
*/
 
 
8. 编写一个枚举,描述RGB立方体的8个角。ID使用颜色值(例如,红色是0xff0000)。
object  RGB  extends  Enumeration  with  App{
     val  RED  =  Value( 0xff0000 , "Red" )
     val  BLACk  =  Value( 0x000000 , "Black" )
     val  GREEN  =  Value( 0x00ff00 , "Green" )
     val  CYAN  =  Value( 0x00ffff , "Cyan" )
     val  YELLO  =  Value( 0xffff00 , "Yellow" )
     val  WHITE  =  Value( 0xffffff , "White" )
     val  BLUE  =  Value( 0x0000ff , "Blue" )
     val  MAGENTA  =  Value( 0xff00ff , "Magenta" )
}
 

转载于:https://www.cnblogs.com/chenjo/p/4436595.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值