你正在设计一个二维游戏的界面,需要用很多的点来表示游戏中的角色。
设计一个 Point 类,其 x 和 y 可以通过构造器提供。
它有几个方法:
-
方法 1: 计算自己在哪个象限。 whereAmI():String
-
方法 2: 计算和坐标原点的距离。 getDist():Double
-
方法 3: 计算与另一个点的距离。 fromPoint(other:Point):Double
-
方法 4: 重写 equals 判断是否是同一个点(x 和 y 都相等就是同一个点)。
-
方法 5: 重写 toString,更友好的输出点的信息。 再设计一个子类 LabelPoint 它来继承 Point 类,其构造器接收一个标签值和 x,y 坐标。
例如: New LabelPoint("black",1,2)
父类名:Point;
属性名:x,y
方法:whereAmI, getDist,fromPoint, equals, toString。
子类名:LabelPoint
属性:label。
package Level02
object O01 {
class Point(var x: Double, var y: Double) {
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轴上"
}
def getDist(): Double = {
Math.sqrt(x * x + y * y)
}
def fromPoint(other: Point): Double = {
val dx = x - other.x
val dy = y - other.y
Math.sqrt(dx * dx + dy * dy)
}
override def toString: String = {
s"Point($x, $y)"
}
override def equals(obj: Any): Boolean = {
obj match {
case other: Point => x == other.x && y == other.y
case _ => false
}
}
}
// 子类 LabelPoint 继承 Point 类
class LabelPoint(label: String, x: Double, y: Double) extends Point(x, y) {
override def toString: String = {
s"LabelPoint($label, $x, $y)"
}
}
// 测试代码
def main(args: Array[String]): Unit = {
val p1 = new Point(1.0, 2.0)
val p2 = new Point(3.0, 4.0)
val p3 = new Point(1.0, 2.0)
val lp1 = new LabelPoint("black", 5.0, 6.0)
println(p1.whereAmI()) // 输出:第一象限
println(p1.getDist()) // 输出:约2.236
println(p1.fromPoint(p2)) // 输出:约2.828
println(p1.equals(p3)) // 输出:true
println(p1) // 输出:Point(1.0, 2.0)
println(lp1) // 输出:LabelPoint(black, 5.0, 6.0)
}
}