假设我有以下特征和类扩展该特征
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
}
我在f
的声明中将protected
声明为T
,以便可以从C
的范围内调用,但不能由其他人调用。换句话说,C.f()
应该是编译错误。我认为来自protected
的{{1}}修饰符会延续,但事实并非如此。
我可以在T
的声明中将C.f()
重新声明为protected
,但我宁愿不必重复自己。在Scala中还有其他方法吗?
答案 0 :(得分:4)
简答:不。
不指定访问修饰符并不意味着“继承访问修饰符”,它意味着“公共”。 Scala没有public
关键字,如果它不起作用,那么在覆盖时实际上无法公开受保护的成员。
换句话说,您必须重复protected
修饰符。
答案 1 :(得分:1)
我加入ghik
的答案,想要添加更多内容。
如果您有trait T { protected def f() }
,那么您的扩展类可能会f()
声明为def f()
(这意味着public
表示为ghik
)或{{1 },但不是protected def f()
。
一般规则是您无法将访问类型更改为限制性更强的,您只能将其扩大,因此如果您的特征中只有一个简单的private def f()
,班级甚至不能将其声明为def f()