题目如下
设计一个Point类,其x和y可以通过构造器提供。 它有几个方法:
- 方法1: 计算自己在哪个象限。 whereAmI():String
- 方法2: 计算和坐标原点的距离。getDist():Double
- 方法3: 计算与另一个点的距离。fromPoint(other:Point):Double
- 方法4: 重写equals 判断是否是同一个点(x和y都相等就是同一个点)。
- 方法5: 重写toString,更友好的输出点的信息。 再设计一个子类LabelPoint它来继承Point类,其构造器接收一个标签值和x,y坐标。
代码输出
object class17 {
// 定义Point类,主构造器接收x和y坐标
class Point(val x: Double, val y: Double) {
// 方法1:判断当前点所在象限
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 "位于第四象限" // x > 0 && y < 0的情况
}
// 方法2:计算与原点的距离
def getDist(): Double = math.sqrt(x * x + y * y)
// 方法3:计算与另一个点的距离
def fromPoint(other: Point): Double = {
val dx = other.x - this.x
val dy = other.y - this.y
math.sqrt(dx * dx + dy * dy)
}
// 方法4:重写equals方法判断是否为同一点
override def equals(obj: Any): Boolean = obj match {
case that: Point => this.x == that.x && this.y == that.y
case _ => false
}
// 方法5:重写toString方法
override def toString: String = f"Point($x%.2f, $y%.2f)"
}
// 定义LabelPoint子类,继承自Point
class LabelPoint(val label: String, x: Double, y: Double) extends Point(x, y) {
// 重写toString方法,包含标签信息
override def toString: String = f"LabelPoint($label, ${super.toString})"
}
// 测试示例
def main(args: Array[String]): Unit = {
val p1 = new Point(3, 4)
println(p1.whereAmI()) // 位于第一象限
println(p1.getDist()) // 5.0
val p2 = new Point(0, 0)
println(p1.fromPoint(p2)) // 5.0
val lp = new LabelPoint("black", 1, 2)
println(lp) // LabelPoint(black, Point(1.00, 2.00))
println(lp.whereAmI()) // 位于第一象限
println(lp.equals(new Point(1, 2))) // true
}
}