首页 文章

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

提问于
浏览
0

我知道这个语法不会编译,但我想知道这样的事情是否可能......能够覆盖具有相同名称的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

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

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

    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
    
  • 1

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

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

相关问题