作业

16 阅读1分钟
package level02

object class015 {
  // 父类:Point(点类,包含坐标属性和相关方法)
  class Point(val x: Double, val y: Double) {
    // 计算当前点到另一个点的距离(欧几里得距离)
    def getDist(other: Point): Double = {
      val dx = this.x - other.x
      val dy = this.y - other.y
      Math.sqrt(dx * dx + dy * dy)
    }

    // 从当前点移动指定偏移量,返回新的 Point 对象
    def move(dx: Double, dy: Double): Point = {
      new Point(this.x + dx, this.y + dy)
    }

    // 重写 toString 方法,方便打印输出
    override def toString: String = s"Point($x, $y)"
  }

  // 子类:LabelPoint(带标签的点类,继承自 Point)
  class LabelPoint(val label: String, x: Double, y: Double) extends Point(x, y) {
    // 获取标签的方法(也可直接通过 label 属性访问,这里提供方法供选择)
    def getLabel: String = label

    // 重写 move 方法,确保移动后返回 LabelPoint 类型(协变返回值)
    override def move(dx: Double, dy: Double): LabelPoint = {
      new LabelPoint(this.label, this.x + dx, this.y + dy)
    }

    // 重写 toString 方法,包含标签信息
    override def toString: String = s"LabelPoint(label='$label', x=$x, y=$y)"
  }

  // 测试对象(运行入口)
  object PointTest extends App {
    // 测试父类 Point
    val p1 = new Point(1.0, 2.0)
    val p2 = new Point(4.0, 6.0)
    println("Point p1: " + p1)
    println("Point p2: " + p2)
    println("p1 到 p2 的距离: " + p1.getDist(p2)) // 输出 5.0
    println("p1 移动 (3,4) 后: " + p1.move(3, 4)) // 输出 Point(4.0, 6.0)

    println("-" * 30)

    // 测试子类 LabelPoint(继承 Point 的所有功能,新增标签)
    val lp1 = new LabelPoint("起点", 0.0, 0.0)
    val lp2 = new LabelPoint("终点", 5.0, 12.0)
    println("LabelPoint lp1: " + lp1)
    println("LabelPoint lp2: " + lp2)
    println("lp1 的标签: " + lp1.getLabel) // 输出 起点
    println("lp1 到 lp2 的距离: " + lp1.getDist(lp2)) // 继承父类方法,输出 13.0
    println("lp1 移动 (2,3) 后: " + lp1.move(2, 3)) // 重写方法,返回 LabelPoint
  }
}