2015-09-10 84 views
0

我有一個具有兩個參數和另一個參數構造函數的Scala類。對於一個參數構造函數,我調用了一個方法來獲取兩個元素的元組,並嘗試將元組用作需要兩個參數的構造函數的參數。從這個職位:Scala tuple unpacking for constructors我可以得到一個非繼承的情況下的答案,但我需要使用繼承的情況下的方法。斯卡拉元組解包用於繼承的抽象類構造函數

這是我的代碼,但我不知道如何實例化抽象類。

abstract class A(val a:Int, val b:Int) { 
    def h()// = ??? 
} 

object A { 
    def apply(pair: (Int, Int)): A = new A(pair._1, pair._2) 
    def apply(v: Int): A = A(vals(v)) 
    def vals(v:Int) = { 
     (v,v) 
    } 
} 

class B(override val a:Int, override val b:Int) extends A(a,b) { 
    override def h() = ??? 
} 

object B { 
    def apply(pair: (Int, Int)): B = new B(pair._1, pair._2) 
    def apply(v: Int): B = B(A.vals(v)) 
} 

object Main extends App { 
    val a = B(10) 
    println(a.a, a.b) 
} 

當然,如果我試圖實例化抽象類,我收到了錯誤消息。

error: class A is abstract; cannot be instantiated 
def apply(pair: (Int, Int)): A = new A(pair._1, pair._2) 
           ^

我認爲最簡單的解決方法就是使抽象類非抽象,並給虛擬主體def h() = ???。不過,我不確定有沒有更好的方法。

+2

由於一個'A'不能直接實例化,沒有必要這裏的構造函數或工廠方法吧 - 放棄對'A'同伴對象(以及在移動'vals'方法'乙你的同伴對象),你應該沒問題。 – Shadowlands

+0

@Shadowlands:我很感謝。 – prosseek

回答

0

從Shadowlands的提示中,我可以僅將apply()僅用於具體類。

// http://stackoverflow.com/questions/32512401/scala-tuple-unpacking-for-constructors 


abstract class A(val a:Int, val b:Int) { 
    def h()// = ??? 
} 

object A { 
    def vals(v:Int) = { 
     (v,v) 
    } 
} 

class B(override val a:Int, override val b:Int) extends A(a,b) { 
    override def h() = ??? 
} 

object B { 
    def apply(pair: (Int, Int)): B = new B(pair._1, pair._2) 
    def apply(v: Int): B = B(A.vals(v)) 
} 

object Main extends App { 
    val a = B(10) 
    println(a.a, a.b) 
}