重点章节,与java有着比较大的分歧,在java与scala中都仅能继承一个基类,这么做是为了避免菱形继承,所以两者都限制的很死,只能单继承,但这样就对类的特质化产生了障碍,而为了避免这些问题,java提供了interface,scala则提供了trait也就是特质,接口类和trait的区别在于,一个仅能提供抽象的方法,且不能包含具体实现方法和字段,而在trait中则没有这个限制,trait与scala中类的区别只有一点,就是没有带参数的构造函数
一、java.awt.Rectangle类有两个很好用的方法translate和grow,但可惜的是像java.awt.geom.Eclipse2D这样的类中没有。在scala中,你可以解决掉这个问题。定义一个RectangleLike特质,加入具体的translate和grow方法,提供任何你需要用来实现的方法,即便你可以像如下的代码这样混入特质
val egg=new java.awt.geom.Eclipse2D.Double(5,10,20,30) with RectangleLike
egg.translate(10,-10)
egg.groww(10,20)
trait RectangleLike {
//自身类型代表只能混入eclipse2d类
this:java.awt.geom.Ellipse2D.Double=>
def translate(x:Int,y:Int):Unit={
this.x=x;
this.y=y;
}
def grow(x:Int,y:Int){
this.x=x;
this.y=y;