今天首先完成了Scala编程的第二个实验。
实验内容:
源代码:
1 case class Point(var x:Double,var y:Double)extends Drawable 2 { 3 def shift(deltaX:Double,deltaY:Double) 4 { 5 x+=deltaX; 6 y+=deltaY 7 } 8 } 9 trait Drawable 10 { 11 def draw(){println(this.toString)} 12 } 13 abstract class Shape(var location:Point)//location是Shape的一个可变字段 14 { 15 def moveTo(newLocation:Point)//默认实现,只是修改位置 16 { 17 location=newLocation 18 } 19 def zoom(scale:Double) 20 } 21 class Line(beginPoint:Point,var endPoint:Point)extends Shape(beginPoint)with Drawable 22 { 23 override def draw() 24 { 25 println(s"Line:(${location.x},${location.y})--(${endPoint.x},${endPoint.y})")//按规定格式重载click 26 } 27 28 override def moveTo(newLocation:Point) 29 { 30 endPoint.shift(newLocation.x-location.x,newLocation.y-location.y)//直线移动时,先移动另外一个端点 31 location=newLocation //移动位置 32 } 33 34 override def zoom(scale:Double) 35 { 36 val midPoint=Point((endPoint.x+location.x)/2,(endPoint.y+location.y)/2) //求出中点,并按中点进行缩放 37 location.x=midPoint.x+scale*(location.x-midPoint.x) 38 location.y=midPoint.y+scale*(location.y-midPoint.y) 39 endPoint.x=midPoint.x+scale*(endPoint.x-midPoint.x) 40 endPoint.y=midPoint.y+scale*(endPoint.y-midPoint.y) 41 } 42 } 43 44 class Circle(center:Point,var radius:Double)extends Shape(center)with Drawable 45 { 46 override def draw() //按规定重载click 47 { 48 println(s"Circle center:(${location.x},${location.y}),R=$radius") 49 } 50 51 override def zoom(scale:Double) 52 { 53 radius=radius*scale //对圆的缩放只用修改半径 54 } 55 } 56 57 object MyDraw 58 { 59 def main(args:Array[String]) 60 { 61 val p=new Point(10,30) 62 p.draw 63 64 val line1=new Line(Point(0,0),Point(20,20)) 65 line1.draw 66 line1.moveTo(Point(5,5)) 67 line1.draw 68 line1.zoom(2) 69 line1.draw 70 71 val cir=new Circle(Point(10,10),5) 72 cir.draw 73 cir.moveTo(Point(30,20)) 74 cir.draw 75 cir.zoom(0.5) 76 cir.draw 77 } 78 79 }
运行结果如图:
原文:https://www.cnblogs.com/qianmo123/p/12242515.html