2015-09-10 3 views
0

У меня есть класс Scala с двумя параметрами и еще один конструктор параметров. Для одного конструктора параметров я вызвал метод для получения кортежа из двух элементов и попытался использовать кортеж для параметра конструктора, для которого требуются два параметра. Из этого сообщения: Scala tuple unpacking for constructors Я мог бы получить ответ на случай отсутствия наследования, но мне нужно использовать метод для случая наследования.Scala tuple распаковка для конструкторов с абстрактным классом для наследования

Это мой код, но я не уверен, как создать экземпляр абстрактного класса.

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' никогда не может быть реализован напрямую, нет необходимости здесь конструкторам или фабричные методы для него - уронить объект компаньон для' Ā' (и переместить 'метод vals' к' B 's сопутствующий объект), и вы должны быть в порядке. – 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) 
} 
Смежные вопросы