Scala 面向对象编程:Point 类设计与实现

124 阅读3分钟

问题描述

在二维游戏界面设计中,我们需要用点来表示游戏中的角色位置。需要设计一个 Point 类来表示二维坐标点,并提供相关功能方法。

代码实现

Point.scala - 主类定义

package FinalsProject.student

// 定义 Point 类
class Point(var x: Double, var y: Double) {
  // 方法1:判断点所在象限
  def whereAmI(): String = {
    if (x > 0 && y > 0) "第一象限"
    else if (x < 0 && y > 0) "第二象限"
    else if (x < 0 && y < 0) "第三象限"
    else if (x > 0 && y < 0) "第四象限"
    else if (x == 0 && y == 0) "原点"
    else if (x == 0) "在 y 轴上"
    else "在 x 轴上"
  }

  // 方法2:计算到原点的距离
  def getDist(): Double = {
    math.sqrt(x * x + y * y)
  }

  // 方法3:计算与另一个点的距离
  def fromPoint(other: Point): Double = {
    val dx = x - other.x
    val dy = y - other.y
    math.sqrt(dx * dx + dy * dy)
  }

  // 方法4:重写 equals 方法判断是否为同一个点
  override def equals(obj: Any): Boolean = {
    obj match {
      case p: Point => x == p.x && y == p.y
      case _ => false
    }
  }

  // 方法5:重写 toString 方法,友好输出点信息
  override def toString: String = {
    s"Point($x, $y)"
  }
}

代码解析

  1. 类定义Point 类有两个可变属性 xy,通过构造器参数初始化
  2. 象限判断whereAmI 方法通过判断坐标值的正负来确定点所在的象限或坐标轴
  3. 距离计算
    • getDist 使用勾股定理计算到原点的距离
    • fromPoint 计算与另一个点的距离,使用两点间距离公式
  4. 相等性判断:重写 equals 方法,当两个点的 x 和 y 坐标都相等时返回 true
  5. 字符串表示:重写 toString 方法,提供格式化的坐标输出

LabelPoint.scala - 子类扩展

package FinalsProject.student

// 定义 LabelPoint 子类,继承自 Point
class LabelPoint(label: String, x: Double, y: Double) extends Point(x, y) {
  override def toString: String = {
    s"LabelPoint($label, $x, $y)"
  }
}

代码解析

  1. 继承关系LabelPoint 继承自 Point 类,具有点的所有特性
  2. 额外属性:添加了 label 属性用于标记点的类型或名称
  3. 方法重写:重写 toString 方法,在输出中包含标签信息

PointTest.scala - 测试代码

package FinalsProject.student

// 测试代码
object PointTest extends App {
  val p1 = new Point(1, 1)
  println(p1.whereAmI()) // 第一象限
  println(p1.getDist())  // 约1.4142

  val p2 = new Point(2, 3)
  println(p1.fromPoint(p2)) // 约2.2361

  val p3 = new Point(1, 1)
  println(p1 == p3) // true

  val lp = new LabelPoint("black", 1, 2)
  println(lp) // LabelPoint(black, 1.0, 2.0)
}

代码解析

  1. 功能测试:创建多个点对象,测试各种方法的功能
  2. 象限判断:测试点 (1,1) 确实在第一象限
  3. 距离计算:验证到原点和到其他点的距离计算正确
  4. 相等性测试:验证两个相同坐标的点被判断为相等
  5. 子类测试:创建带标签的点并测试其输出格式

总结

这个实现展示了 Scala 面向对象编程的核心特性:

  • 类的定义和构造器使用
  • 方法的定义和实现
  • 继承关系的建立
  • 方法重写(override)
  • 模式匹配在 equals 方法中的应用
  • 字符串插值在 toString 方法中的使用

代码结构清晰,功能完整,符合面向对象的设计原则,可以很好地满足二维游戏中点坐标管理的需求。