2014-09-23 42 views
1

例如,在C++我可以這樣做:在scala中,你如何從不同的輸入實例化一個類?

class x { 
    int _a; 
    int _b; 
    int _c; 
    public: 
     x(int a, int b, int c) { _a = a; _b = b; _c = c; } 
     x(y& other) { 
        sometype z = deserialize(y) 
        // ...do some magic 
        _a = z.a; _b = z.b; _c = z.c; 
     } 

} 

所以可以實例(X)由離散的參數(3個整數),或定義構造,其中我接受(Y)的一個實例,反序列化它並從中提取數據。

斯卡拉

我希望有這個,這是不行的,因爲我不能有別的調用主構造

case class x (int a, int b, int c) { 
    def this(from:y) { 
    val z = deserialize(x); // this will fail 
    // do some magic; 
    this(z.a, z.b, z.c)} 
} 

我可以採取替代構造邏輯之前和外化它做在創建對象之前由一個助手創建,但如果可能的話,我想保留封裝。

對此有更好的模式嗎?

回答

5

您可以在伴侶對象中添加自己的apply方法。

下面是一個簡單的例子,其中a,b,c是從字符串中讀取的。

case class x (a: Int, b: Int, c: Int) 

object x { 
    def apply(s: String): x = { 
    val ints = s.split(",") 
    x(ints(0).toInt, ints(1).toInt, ints(2).toInt) 
    } 
} 

然後調用x("1,2,3")會給你x(1,2,3)

+0

謝謝。我需要對伴侶物品做更多的閱讀,我想,我沒有想到它就在手邊。斯卡拉使這麼多事情變得簡單,但有些事情感到麻煩。 – 2014-09-23 14:37:12

相關問題