【问题标题】:Overriden method can call on inherited private getter, but not inherited private setters重写的方法可以调用继承的私有 getter,但不能调用继承的私有 setter
【发布时间】:2017-01-19 10:48:12
【问题描述】:

我认为这可能适用于 Java 和 Scala,但是 - 学习 Scala 一周后,所以尝试一下。我有这个:

class myBaseClass {

  private var member: Int = 100

  def doStuff(): Unit ={
    checkMember()
    alterMember(5)
  }

  private[this] def checkMember(): Unit = {
  //throws exception if member < 0
  }

  private[this] def alterMember(i : Int): Unit = {
    member -= i
  }

}

然后我有一个继承了很多的类,只覆盖了一个方法来调用 alterMember 具有不同的值:

class mySubClass extends myBaseClass {

  override def doStuff(): Unit ={
        checkMember() // gives compiler error
        alterMember(10) // gives compiler error AND IntelliJ says "alterMember inaccessible from this place"
   }
}

checkMember()alterMember 就像私有的 getter 和 setter 一样。 (我只希望 doStuff 能够更改 member ,并且都是继承的。错误 - 忽略这个我不明白为什么 mySubClass 显然能够访问私有成员,因为 checkMember 很好,但它似乎无法改变它。为什么会有这种差异?忽略这里

删除[this] 没有区别,但将alterMember 公开“修复”它 - 但提供了我不想要的member 访问级别。

【问题讨论】:

  • 请发布您的实际,编译重现问题的代码 - 您在上面发布的代码包含语法错误,例如您在checkMember 前面忘记了defalterMembermyBaseClass= 之间,在Unit{ 之间。
  • 我不知道你是如何使checkMember() 编译的,但我在这两种方法上都“无法从这个地方访问”。我建议使用protected!
  • 感谢您指出错误,已修复。我的原始代码无法编译 - 并且包含更多详细信息和其他类的细节,这可能会掩盖我所追求的特定概念。
  • 我无法用您的固定代码重现您的问题。在 Scala 2.12 REPL 中,对这两种方法的调用都会给出“错误:未找到:值 ”。
  • 嗯...通过编译它给了我error: not found: 两种方法。但 IntelliJ 只抱怨(在编辑时)后者。

标签: scala inheritance private


【解决方案1】:

根据@MuratMustafin 的建议,这里的答案是保护member 和两个私有方法。

还有什么是我需要在尝试编译 mySubClass 之前编译 myBaseClass ,否则它会说 mySubClass 找不到那些受保护的方法。也许 Scala 编译器与 Java 编译器的不同之处在于它不会自动知道要全部编译它们,还是按顺序编译它们。

【讨论】:

    猜你喜欢
    • 2020-11-08
    • 2013-01-01
    • 1970-01-01
    • 2021-07-16
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-07
    相关资源
    最近更新 更多