[关闭]
@amoszhou 2014-05-15T06:09:41.000000Z 字数 821 阅读 1277

第十章:trait(特质)

scala课后习题


1. java.awt.Rectangle类有两个很有用的方法translate和grow,但可惜的是像java.awt.geom.Ellipse2D这样的类没有。在Scala中,你可以解决掉这个问题。定义一个RenctangleLike特质,加入具体的translate和grow方法。提供任何你需要用来实现的抽象方法,以便你可以像如下代码这样混入该特质:

  1. val egg = new java.awt.geom.Ellipse2D.Double(5,10,20,30) with RectangleLike
  2. egg.translate(10,-10)
  3. egg.grow(10,20)

不知道这样写,能不能符合题意:

  1. trait RectangleLike{
  2. this:Ellipse2D.Double=>
  3. def translate(x:Double,y:Double){
  4. this.x = x
  5. this.y = y
  6. }
  7. def grow(x:Double,y:Double){
  8. this.x += x
  9. this.y += y
  10. }
  11. }

2. 通过把scala.math.Ordered[Point]混入java.awt.Point的方式,定义OrderedPoint类。按辞典编辑方式排序,也就是说,如果x < x'或者x = x' 且 y < y'则(x,y)<(x',y')

进去看了一下源码,Ordered是个带泛型的trait。有一个抽象的compare方法,那就是重写即可以

  1. class OrderedPoint extends Point with Ordered[Point]{
  2. def compare(that: Point): Int = if (this.x <= that.x && this.y < that.y) -1
  3. else if(this.x == that.x && this.y == that.y) 0
  4. else 1
  5. }

其它题目好像没有会好写的,基本上只要理会了trait的本质,剩下的题,基本上都是类似的。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注