2015-09-27 99 views
2

如何爲抽象類中的方法提供參數,以便稍後可以擴展該參數?我將在下面說明一個簡單的情況。Scala - 可以擴展的抽象基類中的參數類型

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驅動[T <:驅動](x:T):Int,但仍然沒有任何運氣。看來我缺少一些簡單而明顯的東西。

這樣的設計有什麼問題嗎?

回答

6

您可以在Scala中使用abstract type

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