子类的继承2

51 阅读1分钟

当父类,子类都含参数的构造器的时候,如何进行参数传递?


// 当父类,子类都含参数的构造器的时候,如何进行参数传递?
// 父类: name, age
class Animal(val name:String, var age:Int) {
  println(s"父类构造器 ..... $name $age")

  def eat():Unit = {
    println(s"$name $age eating.....")
  }
}

// 子类: name, age, color
class Dog(name:String, age:Int, var color:String) extends Animal(name, age) {
  // color是子类自己的属性,需要修饰符
  // 参数传递 name age 前面不需要任何修饰符
  println(s"子类构造器 ..... $name $age $color")
}


  def main(args: Array[String]): Unit = {
    val dog1 = new Dog("旺财", 1, "黑色")
    dog1.eat()

案例背景

你正在设计一个二维游戏的界面,需要用很多的点来表示游戏中的角色。

设计一个Point类,其x和y可以通过构造器提供。

它有几个方法:

1. 方法1: 计算自己在哪个象限。 whereAmI():String

2. 方法2: 计算和坐标原点的距离。getDist():Double

3. 方法3: 计算与另一个点的距离。fromPoint(other:Point):Double

4. 方法4: 重写equals 判断是否是同一个点(x和y都相等就是同一个点)。

5. 方法5: 重写toString,更友好的输出点的信息。

再设计一个子类LabelPoint它来继承Point类,其构造器接收一个标签值和x,y坐标。

例如: New LabelPoint("black",1,2)

class Point(var x:Double, var y:Double) {
    def whereAmI():String = {
      if(x >0 && y >0){
        "第1象限"
      } else if(x>0 && y < 0){
        "第4象限"
      } else if(x<0 && y < 0){
        "第3象限"
      }else if(x<0 && y > 0){
        "第2象限"
      }  else {
        "未知"
      }
    }
    def getDist():Double = {
      Math.sqrt( this.x * this.x + this.y * this.y )
    }

    def fromPoint(other:Point):Double = {
      Math.sqrt( (this.x-other.x) * (this.x-other.x) + (this.y-other.y) * (this.y-other.y ) )
    }

  }

  def main(args: Array[String]): Unit = {
    val p1 = new Point(1,1)
    val p2 = new Point(1,1)
    println(p1 == p2)
    println(p1.whereAmI())
    println(p1.getDist())
    println(p1.fromPoint(p2))
  }
}