У меня есть класс 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() = ???
. Однако я не уверен, что может быть лучший способ.
Поскольку 'A' никогда не может быть реализован напрямую, нет необходимости здесь конструкторам или фабричные методы для него - уронить объект компаньон для' Ā' (и переместить 'метод vals' к' B 's сопутствующий объект), и вы должны быть в порядке. – Shadowlands
@Shadowlands: Я получил это благодаря. – prosseek