2011-06-15 166 views
1

這是一個微不足道的問題,我只是想知道我是否可以在這裏使用Scala-ish。我有兩個不同的類(Server1Server2)都實現了一個通用接口/特性(方法.A().B())。Scala:兩個不同類的實例,相同的方法

這顯然混淆編譯:

var server = null 
if(cond) server=new Server1 else server=new Server2 
server.A() //or server.B() 

我主要是好奇,如果我可以使用Scala的選項來解決這個問題的一種巧妙的方法。謝謝。

回答

8

類型的註釋可以隨時補充說:

var server: TraitOrInterface = null 

然而,由於瓦爾有點噁心......

val server = if (cond) { 
    new Server1() 
} else { 
    new Server2() 
} 

在第二個例子中,斯卡拉應該能夠統一類型。 (我相當肯定,有些情況是無法統一的 - 或者它沒有統一到需要的地方,但是在返回到註釋類型之前給它一個註釋,可以按照第一個例子添加註釋。)

REPL示範:

class X 
trait Y 
class A extends X with Y {} 
class B extends X with Y {} 
val uni = if (true) new A() else new B() 
uni 
>> res3: X with Y = [email protected] 

編碼愉快。


結構打字例如,type別名是爲了方便,但在技術上不是必需的。

class Cat { def speak() = "meow" } 
class Dog { def speak() = "woof" } 
type ThingThatSpeaks = { def speak(): String } 

val speaker : ThingThatSpeaks = if (true /* smart */) new Cat() else new Dog() 
speaker 
>> res4: ThingThatSpeaks = [email protected] 
speaker.speak() 
>> res5: String = meow 

注意,被要求類型標註,否則......

val speaker = if (true /* smart */) new Cat() else new Dog() 
speaker 
>> res6: ScalaObject = [email protected] 
speaker.speak() 
>> error: value speak is not a member of ScalaObject 
+0

,如果它不是一個共同的特點,但偶然相同的方法名稱? (是的,這是廢話 - 但以防萬一) – parsa 2011-06-15 08:28:25

+1

@parsa然後你可以使用[結構打字](http://codemonkeyism.com/scala-goodness-structural-typing/):-) – 2011-06-15 08:31:40

+1

@parsa我添加了一個例子利用結構分型。 – 2011-06-15 08:39:50

1

Option,但Either

var server = if (cond) Right(new Server1) else Left(new Server2) 
server match { 
    case Right(srv) => srv.A() 
    case Left(srv) => srv.B() 
} 
相關問題