如何为抽象类中的方法提供参数,以便以后可以扩展该参数?我将在下面说明一个简单的场景。
abstract class Car {
def drive(x: Driver)
}
abstract class Driver
case class DriverA(name: String) extends Driver
case class DriverB(name: String, age: Int) extends Driver
class Audi extends Car {
// each child class should have a more specific type for param "x"
def drive(x: DriverA) = { ... }
}
class BMW extends Car {
// each child class should have a more specific type for param "x"
def drive(x: DriverB) = { ... }
}
但这在Scala中不起作用:“错误:[..]方法参数类型必须完全匹配”
我也尝试指定像def drive [T <:Driver](x:T):Int这样的上限类型,但是仍然没有运气。似乎我缺少一些简单而明显的东西。
这样的设计有什么问题吗?
您可以在scala中使用抽象类型:
scala> :paste
// Entering paste mode (ctrl-D to finish)
abstract class Car {
type D <: Driver
def drive(x: D): Unit
}
abstract class Driver
case class DriverA(name: String) extends Driver
case class DriverB(name: String) extends Driver
class Audi extends Car {
type D = DriverA
def drive(x: DriverA): Unit = println(x.name)
}
// Exiting paste mode, now interpreting.
defined class Car
defined class Driver
defined class DriverA
defined class DriverB
defined class Audi
scala> new Audi().drive(DriverA("test"))
test
或使用带有类型参数化的类:
scala> :paste
// Entering paste mode (ctrl-D to finish)
abstract class Driver
case class DriverA(name: String) extends Driver
abstract class Car[D <: Driver] {
def drive(x: D): Unit
}
class Audi extends Car[DriverA] {
def drive(x: DriverA) = println(x.name)
}
// Exiting paste mode, now interpreting.
scala> new Audi().drive(DriverA("zzz"))
zzz
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句