case class Point(var x:Double,var y:Double)extends Drawable
{
def shift(deltaX:Double,deltaY:Double)
{
x+=deltaX;
y+=deltaY
}
}
trait Drawable
{
def draw(){println(this.toString)}
}
abstract class Shape(var location:Point)//location是Shape的一个可变字段
{
def moveTo(newLocation:Point)//默认实现,只是修改位置
{
location=newLocation
}
def zoom(scale:Double)
}
class Line(beginPoint:Point,var endPoint:Point)extends Shape(beginPoint)with Drawable
{
override def draw()
{
println(s"Line:(${location.x},${location.y})--(${endPoint.x},${endPoint.y})")//按规定格式重载click
}
override def moveTo(newLocation:Point)
{
endPoint.shift(newLocation.x-location.x,newLocation.y-location.y)//直线移动时,先移动另外一个端点
location=newLocation //移动位置
}
override def zoom(scale:Double)
{
val midPoint=Point((endPoint.x+location.x)/2,(endPoint.y+location.y)/2) //求出中点,并按中点进行缩放
location.x=midPoint.x+scale*(location.x-midPoint.x)
location.y=midPoint.y+scale*(location.y-midPoint.y)
endPoint.x=midPoint.x+scale*(endPoint.x-midPoint.x)
endPoint.y=midPoint.y+scale*(endPoint.y-midPoint.y)
}
}
class Circle(center:Point,var radius:Double)extends Shape(center)with Drawable
{
override def draw() //按规定重载click
{
println(s"Circle center:(${location.x},${location.y}),R=$radius")
}
override def zoom(scale:Double)
{
radius=radius*scale //对圆的缩放只用修改半径
}
}
object MyDraw
{
def main(args:Array[String])
{
val p=new Point(10,30)
p.draw
val line1=new Line(Point(0,0),Point(20,20))
line1.draw
line1.moveTo(Point(5,5))
line1.draw
line1.zoom(2)
line1.draw
val cir=new Circle(Point(10,10),5)
cir.draw
cir.moveTo(Point(30,20))
cir.draw
cir.zoom(0.5)
cir.draw
}
}