在设计绘图程序库时常常需要定义一些具有矩形形状的类型:比如窗口,bitmap图像,矩形选取框等。为了方便使用这些矩形对象,函数库对象类提供了查询对象宽度和长度的方法(比如width,height)和坐标的left,right,top和bottom等方法。然而在实现这些函数库的这样方法,如果使用Java来实现,需要重复大量代码,工作量比较大(这些类之间不一定可以定义继承关系)。但如果使用Scala来实现这个图形库,那么可以使用Trait,为这些类方便的添加和矩形相关的方法。
首先我们先看看如果使用不使用Trait如何来实现这些类,首先我们定义一些基本的几何图形类如Point和Rectangle:
class Point(val x:Int, val y:Int) class Rectangle(val topLeft:Point, val bottomRight:Point){ def left =topLeft.x def right =bottomRight.x def width=right-left // and many more geometric methods }
这里我们定义一个点和矩形类,Rectangle类的主构造函数使用左上角和右下角坐标,然后定义了 left,right,和width一些常用的矩形相关的方法。
同时,函数库我们可能还定义了一下UI组件(它并不是使用Retangle作为基类),其可能的定义如下:
abstract class Component { def topLeft :Point def bottomRight:Point def left =topLeft.x def right =bottomRight.x def width=right-left // and many more geometric methods }
可以看到left,right,width定义和Rectangle的定义重复。可能函数库还会定义其它一些类,也可能重复这些定义。
如果我们使用Trait,就可以消除这些重复代码,比如我们可以定义如下的Rectangular Trait类型:
trait Rectangular { def topLeft:Point def bottomRight:Point def left =topLeft.x def right =bottomRight.x def width=right-left // and many more geometric methods }
然后我们修改Component 类定义使其“融入”Rectangular 特性:
abstract class Component extends Rectangular{ //other methods }
同样我们也修改Rectangle定义:
class Rectangle(val topLeft:Point, val bottomRight:Point) extends Rectangular{ // other methods }
这样我们就把矩形相关的一些属性和方法抽象出来,定义在Trait中,凡是“混合”了这个Rectangluar特性的类自动包含了这些方法:
object TestConsole extends App{ val rect=new Rectangle(new Point(1,1),new Point(10,10)) println (rect.left) println(rect.right) println(rect.width) }
运行结果如下:
1
10
9