繁体   English   中英

如何正确覆盖 Scala 中的方法?

[英]How to properly override a method in Scala?

我有以下“播放器”的实现。

// interface for a player
trait Player {
  def jump(): Unit
  def swim(): Unit
}

// a beginner player can't jump nor swim
class Beginner extends Player {
  def jump(): Unit = throw Error()
  def swim(): Unit = throw Error()
}

// movement decorator abstraction
abstract class MovementDecorator(my_player: Player) extends Player {
}

// concrete decorator
class Swim(player_x: Player) extends MovementDecorator(player_x) {
  def jump(): Unit = throw new Error("I can't jump")
  override def swim(): Unit = println("I swam!")
}

// concrete decorator
class Jump(player_x: Player) extends MovementDecorator(player_x) {
  override def jump(): Unit = println("I jumped!")
  def swim(): Unit = throw new Error("I can't swim")
}

具体的Player (即Beginner )不能有jump()swim()等方法。 但是我可以用Swim和/或Jump类来装饰对象,也就是包装对象,从而为Beginner提供这种能力。

但是,当我运行 main 方法时,我得到了带有注释的输出。

@main
def main(): Unit = {
  val swimmer = Swim(Beginner())
  swimmer.swim() // "I swam!"

  val jumper = Jump(Beginner())
  jumper.jump() // "I jumped!"

  val swimmer_jumper = Jump(Swim(Beginner()))
  swimmer_jumper.jump() // "I jumped!"
  swimmer_jumper.swim() // Exception at Jump.swim: I can't swim
}

我想保留以下内容来创建我的对象

val swimmer_jumper = Jump(Swim(Beginner()))

是否有一种特定的方法可以覆盖我缺少的方法? 我认为当您重写一个方法时,它会重写该对象的任何其他方法——并且它成为首选方法。

您需要修改MovementDecorator以将实现委托给Player的装饰实例:

// movement decorator abstraction
abstract class MovementDecorator(my_player: Player) extends Player {
  override def swim(): Unit = my_player.swim()
  override def jump(): Unit = my_player.jump()
}

然后在MovementDecorator继承者中只覆盖相应的方法:

// concrete decorator
class Swim(player_x: Player) extends MovementDecorator(player_x) {
  override def swim(): Unit = println("I swam!")
}

// concrete decorator
class Jump(player_x: Player) extends MovementDecorator(player_x) {
  override def jump(): Unit = println("I jumped!")
}

演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM