簡體   English   中英

Scala-抽象基類中的參數類型,可以擴展

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM