[英]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.