[英]Scala - parameter type in abstract base class that can be extended
如何為抽象類中的方法提供參數,以便以后可以擴展該參數? 我將在下面說明一個簡單的場景。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.