第八天:模拟图形绘制实验
学习任务
学习如何定义抽象类和抽象方法。
实现 Shape 抽象类,包含 moveTo 和 zoom 方法。
实现 Line 类和 Circle 类,继承 Shape 并混入 Drawable 特质。
重载 draw 方法,实现图形的绘制。
学习内容
抽象类和抽象方法:
定义抽象类和抽象方法。
继承和方法重载:
类的继承和方法重载。
图形绘制:
实现 Line 和 Circle 类的绘制方法。
代码示例
abstract class Shape(val position: Point) {
def moveTo(newPosition: Point): Unit
def zoom(scale: Double): Unit
}

class Line(start: Point, end: Point) extends Shape(start) {
def draw(): Unit = println(s"Line: (${start.x},${start.y})--(${end.x},${end.y})")
def moveTo(newPosition: Point): Unit = {
val deltaX = newPosition.x - position.x
val deltaY = newPosition.y - position.y
start.shift(deltaX, deltaY)
end.shift(deltaX, deltaY)
}
def zoom(scale: Double): Unit = {
val midX = (start.x + end.x) / 2
val midY = (start.y + end.y) / 2
start.x = midX + (start.x - midX) * scale
start.y = midY + (start.y - midY) * scale
end.x = midX + (end.x - midX) * scale
end.y = midY + (end.y - midY) * scale
}
}

class Circle(center: Point, var radius: Double) extends Shape(center) {
def draw(): Unit = println(s"Circle center: (${center.x},${center.y}), R=$radius")
def moveTo(newPosition: Point): Unit = center.shift(newPosition.x - center.x, newPosition.y - center.y)
def zoom(scale: Double): Unit = radius *= scale
}

object MyDraw {
def main(args: Array[String]): Unit = {
val p = new Point(10, 30)
p.draw()
val line1 = new Line(new Point(0, 0), new Point(20, 20))
line1.draw()
line1.moveTo(new Point(5, 5))
line1.draw()
line1.zoom(2)
line1.draw()
val cir = new Circle(new Point(10, 10), 5)
cir.draw()
cir.moveTo(new Point(30, 20))
cir.draw()
cir.zoom(0.5)
cir.draw()
}
}

学习总结
掌握了抽象类和抽象方法的定义。
学会了如何实现继承和方法重载,理解了图形对象的移动和缩放逻辑。