【问题标题】:Scala tuple unpacking for constructors with abstract class for inheritance具有抽象类继承的构造函数的 Scala 元组解包
【发布时间】:2015-09-11 07:53:26
【问题描述】:

我有一个带有两个参数的 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() = ???。但是,我不确定是否有更好的方法。

【问题讨论】:

  • 由于 A 永远无法直接实例化,因此这里不需要构造函数或工厂方法 - 删除 A 的伴随对象(并将 vals 方法移至B 的伴生对象),你应该没事。
  • @Shadowlands:我明白了,谢谢。

标签: scala inheritance


【解决方案1】:

根据 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)
}

【讨论】:

    猜你喜欢
    • 2016-03-12
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 2015-08-06
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    相关资源
    最近更新 更多