2012-05-15 103 views
1

我正在學習Scala,我來自C++(Java經驗很少)。在我工作的地方,我們經常使用以下模式:Scala中的C++嵌套類

class SomeClass { 
public: 
    class Options { 
    ... 
    }; 
    SomeClass(const Options& options); 
    ... 
}; 

int main() { 
    SomeClass::Options options; 
    options.a = ...; 
    ... 
    SomeClass* sc = new SomeClass(options); 
} 

我該如何在Scala中模擬?

回答

5

這是一種等價的:

object SomeClass { 
    case class Options(option1: String, option2: Boolean) 
} 

class SomeClass(options: Options) { 

    //this is constructor! 
    println(options.option1) 

} 

object Main extends App { 
    val options = SomeClass.Options("One", false) 
    //or even: SomeClass.Options(option1 = "One", option2 = false) 
    val sc = new SomeClass(options) 
} 

更多關於嵌套類(不內部類混淆在Java中):Static inner classes in scala

評論:

  • Options嵌套在SomceClass對象,不class
  • Options可以是case class - 這樣你得到不變性和存取免費
  • 在Scala中,你有一個主以非常簡潔的方式定義構造函數
  • 各種各樣:Scala默認使用按引用傳遞,所有var iables實際上是指針(與C++相比,更少的額外符號)。
+0

如果有很多選項,甚至可以使用命名參數使其更清晰。 – aioobe

+0

@aioobe:謝謝,添加到我的回答 –

+0

嗯,看起來有點黑客。假設我有一個類('SomeClass')和一些相關的幫助類,這些類在「SomeClass」的上下文中才有意義(例如,在我的示例中爲'Options')。在C++中,我可以嵌套所有相關的幫助程序類或引入類似「detail」/「internal」命名空間的東西。在Scala中做這件事的首選方法是什麼?請注意,這個關係是在一些類和一個類之間,而不是這個類的一個實例,所以我在這裏不需要/不需要依賴類型。 – Jasiu