2011-05-04 119 views
9

斯卡拉對象在Scala的對象是單身......所以,如果我做:內特質

trait SimpleTrait { 

    def setString(s: String): Unit = { 
    InnerTraitObject setString s 
    } 

    def getString(): String = { 
    return InnerTraitObject getString 
    } 

    object InnerTraitObject { 
    var str: String = "" 

    def setString(s: String): Unit = { 
     str = s 
    } 

    def getString(): String = { 
     return str 
    } 
    } 
} 

然後

class SimpleClass extends SimpleTrait{ 
/// empty impl 
} 

和:

object App { 

    def main(args: Array[String]): Unit = { 

    val a = new SimpleClass(); 
    val b = new SimpleClass(); 

    a.setString("a"); 

    println("A value is " + a.getString()); 
    println("B value is " + b.getString()); 
    } 
} 

我想看到

A value is a 
B value is a 

,但我得到

A value is a 
B value is 

我的問題是: 如果對象是單身,那麼爲什麼,如果我把它放進特質則表現得像普通的對象?

+0

如果你將'InnerTraitObject'移到'SimpleTrait'之外,你會得到想要的行爲。但這不是你的問題的答案。 – 2011-05-04 11:26:50

+0

我知道,因爲現在我使用黑客。 – 2011-05-04 11:32:26

回答

19

它不是一個全球性的單身人士,它是一個單身人士,指的是特質實例(可以有多個實例)。它取決於你定義單例的位置:如果定義在一個包中,那麼它是關於包的單例,包也是單例,因此該對象是單例。你看,它取決於你將某些東西定義爲單例的上下文。如果上下文是單例,那麼定義的對象也是。

+15

或更正式地說:這是一個在定義範圍內的單身人士 – 2011-05-04 12:03:02

+1

很好地概括了;) – 2011-05-04 12:06:25