【问题标题】:Can I inherit access modifiers from super class in Scala?我可以从 Scala 中的超类继承访问修饰符吗?
【发布时间】:2013-10-09 11:28:26
【问题描述】:

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

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
}

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

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

【问题讨论】:

    标签: scala protected


    【解决方案1】:

    简短回答:不。

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

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

    【讨论】:

      【解决方案2】:

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

      如果您有trait T { protected def f() },那么您的扩展类可能会将f() 声明为def f()(这意味着publicghik 所说)或protected def f(),但不是private def f()

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-29
        • 2013-09-27
        • 2017-08-17
        • 2021-06-10
        • 2010-11-26
        • 1970-01-01
        • 2012-04-19
        • 2013-06-23
        相关资源
        最近更新 更多