Overriden方法可以调用继承的私有getter,但不能调用继承的私有setter

时间:2017-01-19 10:48:13

标签: scala inheritance private

我认为这可能适用于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就好了,但似乎无法改变它。为什么会出现这种差异?IGNORE UP TO HERE

删除[this]没有任何区别,但让alterMember公开&#34;修复&#34;它 - 但提供了我不想要的member访问级别。

1 个答案:

答案 0 :(得分:0)

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

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