我知道这个语法不会编译,但我想知道这样的事情是否可能......能够覆盖具有相同名称的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
答案 0 :(得分:1)
我不明白:你为什么要两次宣布id
???
case class Foo(id: Int) extends A
或case 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