我可以从 Scala 中的超类继承访问修饰符吗?

cdk*_*cdk 4 scala protected

假设我有以下特征和扩展该特征的类

trait T { protected def f() }

class C extends T { def f(): println("!") }

object Main extends App {
    val c = new C
    c.f() // should be a compile error
}
Run Code Online (Sandbox Code Playgroud)

我在 for 的声明中f声明了,以便可以从 的范围内调用它,但不能由其他人调用。换句话说,应该是编译错误。我以为修饰符 from会保留下来,但事实并非如此。protectedTCC.f()protectedT

我可以C.f()protected在声明中那样重新声明C,但我不想重复自己。在 Scala 中还有其他方法可以做到这一点吗?

ghi*_*hik 5

简短的回答:不。

不指定访问修饰符并不意味着“继承访问修饰符”,而是意味着“公共”。Scala 没有public关键字,如果它不这样工作,那么在重写时就无法真正将受保护的成员公开。

换句话说,你必须重复protected修改器。