2012-08-10 32 views
0

我在想如何用抽象的方法寫一個抽象基類,將採取任何一個RO兩個Int值。喜歡的東西:抽象基類與抽象方法,將採取一個或兩個值(斯卡拉)

abstract class Foo { 
    def doSomething(???): Unit 
} 

我能想到的,到目前爲止是聲明參數爲Vector[Int],將持有任一個或兩個值,或者更好地執行最多兩個值Tuple2[Int, Int]最好的。

我想這樣做,因爲我想傳遞一個Actor系統中的算法,並且我想要某些消息強制執行算法類型而不是傳遞一個Any,因此抽象基類。

這是最好的方式,還是有更好的方法?

回答

6

通常,這只是用重載方法完成的。然後調用Bar方法時,他們可以通過在一個或兩件事情:

abstract class Foo { 
    def doSomething(a: Int): Int 
    def doSomething(a: Int, b: Int): Int 
} 

class Bar extends Foo { 
    def doSomething(a: Int): Int = a 
    def doSomething(a: Int, b: Int): Int = a * b 
} 

或者,使用默認的參數(這仍然可以讓你做new Bar().doSomething(5)

abstract class Foo { 
    def doSomething(a: Int, b: Int = 1): Int 
} 

class Bar extends Foo { 
    def doSomething(a: Int, b: Int): Int = a * b 
} 

但聽起來像是你想這樣做的方式,你總是調用相同Foo方法,所以在這種情況下,你可以做參數多態性:

trait Thing 
case class Thing1(a: Int) extends Thing 
case class Thing2(a: Int, b: Int) extends Thing 

abstract class Foo { 
    def doSomething(t: Thing): Int 
} 

class Bar extends Foo { 
    def doSomething(t: Thing): Int = t match { 
    case Thing1(a) => a 
    case Thing2(a, b) => a * b 
    } 
} 

或者,由於您只有兩種選擇,您可以使用Either做同樣的事情:

abstract class Foo { 
    def doSomething(t: Either[Int, (Int, Int)]): Int 
} 

class Bar extends Foo { 
    def doSomething(t: Either[Int, (Int, Int)]): Int = t match { 
    case Left(a) => a 
    case Right((a, b)) => a * b 
    } 
}