4

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

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
}

我在声明fprotected声明了 for ,T以便可以从 的范围内调用它C,但不能被其他人调用。也就是说,C.f()应该是编译错误。我认为protected修饰符 fromT会延续,但事实并非如此。

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

4

2 回答 2

5

简短的回答:没有。

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

换句话说,您必须重复protected修饰符。

于 2013-10-02T22:34:52.547 回答
2

我加入了ghik的回答并想添加更多内容。

如果你有一个,trait T { protected def f() }那么你的扩展类可能已经f()声明为def f()(这意味着public如前所述ghik)或protected def f(),但不是private def f()

一般规则是您不能将访问类型更改为更具限制性的类型,您只能扩大它,所以如果您def f()的 trait 有一个简单的,该类甚至不能将其声明为protected

于 2013-10-03T06:48:24.397 回答