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

时间:2013-10-02 22:21:25

标签: 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
}

我在f的声明中将protected声明为T,以便可以从C的范围内调用,但不能由其他人调用。换句话说,C.f()应该是编译错误。我认为来自protected的{​​{1}}修饰符会延续,但事实并非如此。

我可以在T的声明中将C.f()重新声明为protected,但我宁愿不必重复自己。在Scala中还有其他方法吗?

2 个答案:

答案 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()