作业

28 阅读1分钟
object Class18 {
  class Point(var x: Double, var y: Double) {
    // 判断点所在象限或坐标轴
    def whereAMI(): String = {
      if (x == 0 && y == 0) "原点"
      else if (x == 0) "在y轴上"
      else if (y == 0) "在x轴上"
      else if (x > 0 && y > 0) "第一象限"
      else if (x < 0 && y > 0) "第二象限"
      else if (x < 0 && y < 0) "第三象限"
      else "第四象限"
    }

    // 到原点的距离
    def getDist(): Double = {
      Math.sqrt(x * x + y * y)
    }

    // 到另一个点的距离
    def fromPoint(other: Point): Double = {
      val dx = other.x - x
      val dy = other.y - y
      Math.sqrt(dx * dx + dy * dy)
    }

    // 重写toString,便于打印
    override def toString: String = s"Point(${x}, ${y})"

    // 重写equals,判断两个点是否坐标相同
    override def equals(obj: Any): Boolean = {
      obj match {
        case other: Point => this.x == other.x && this.y == other.y
        case _ => false
      }
    }
  }

  // 带标签的点(继承自Point)
  class LabelPoint(label: String, x: Double, y: Double) extends Point(x, y) {
    // 标签属性
    def getLabel: String = label

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

    // 重写equals,需同时判断标签和坐标
    override def equals(obj: Any): Boolean = {
      obj match {
        case other: LabelPoint =>
          this.label == other.label && this.x == other.x && this.y == other.y
        case _ => false
      }
    }
  }

  def main(args: Array[String]): Unit = {
    // 测试Point类
    val p1 = new Point(1.0, 1.0)
    val p2 = new Point(1.0, 1.0)
    val p3 = new Point(0.0, 0.0)
    val p4 = new Point(-2.0, 3.0)

    println(p1.whereAMI())    // 第一象限
    println(p1.getDist())     // 约1.414
    println(p1.fromPoint(p2)) // 0.0(相同点距离为0)
    println(p1 == p2)         // true(坐标相同)
    println(p3.whereAMI())    // 原点
    println(p4.whereAMI())    // 第二象限

    // 测试LabelPoint类
    val lp1 = new LabelPoint("起点", 0.0, 0.0)
    val lp2 = new LabelPoint("起点", 0.0, 0.0)
    val lp3 = new LabelPoint("终点", 0.0, 0.0)

    println(lp1)              // LabelPoint('起点', 0.0, 0.0)
    println(lp1.getLabel)     // 起点
    println(lp1.whereAMI())   // 原点(继承父类方法)
    println(lp1 == lp2)       // true(标签和坐标都相同)
    println(lp1 == lp3)       // false(标签不同)
  }
}