在使用相同的val扩展Trait时覆盖def

时间:2017-08-21 13:23:50

标签: scala inheritance types

我知道这个语法不会编译,但我想知道这样的事情是否可能......能够覆盖具有相同名称的val的继承case类中的trait中定义的内容。

trait A {
    def id: Int

    def getId: Int = id
}

case class Foo(id: Int, graphId: Int) extends A {
    override def id: Int = graphId
}

val f = Foo(1,2)

f.id // => 1
f.getId // => 2

2 个答案:

答案 0 :(得分:1)

我不明白:你为什么要两次宣布id ???

case class Foo(id: Int) extends Acase class Foo(graphId: Int) extends A { def id = graphId }都可以使用。

答案 1 :(得分:0)

您发布的代码实际上几乎是正确的。

如果您尝试编译它,编译器将提示实际问题:

error: value id is defined twice
  conflicting symbols both originated in file '<console>'
       override def id: Int = graphId

所以实际问题是case类会自动为所有构造函数参数生成getter方法。

您可以使用以下命令编译代码:

trait A {

    def id: Int

    def getId: Int = id
}

case class Foo(id: Int, graphId: Int) extends A {
   override def getId: Int = graphId
}


val f = Foo(1,2)

f.id // => 1
f.getId // => 2