【问题标题】:Scala: How to make a protected method accessible to sub-classes (on other instances)?Scala:如何使子类(在其他实例上)可以访问受保护的方法?
【发布时间】:2016-04-04 18:09:52
【问题描述】:

我正在尝试做这样的事情:

trait A[Out] {
    protected def foo(): Out
}

trait B extends A[Int]

class WrapperB(b: B) extends B {
    override protected def foo(): Int = b.foo() + 1
}

这不会编译,因为WrapperB 无权访问b.foo()

有几种方法可以解决这个问题,但这些方法对我不起作用:

  1. foo 公开:不会起作用,因为我希望它保留protected
  2. 使用包范围:行不通,因为我打算在不同的包中包含许多 Bs。

还有其他方法吗?

【问题讨论】:

    标签: scala inheritance access-modifiers


    【解决方案1】:

    怎么样:

    trait A[Out] {
      protected def foo(): Out
    }
    
    trait B extends A[Int] {
      protected def gimme(that: B) = that.foo()
    }
    
    class WrapperB(b: B) extends B {
      override protected def foo(): Int = gimme(b) + 1
    }
    

    我从来不喜欢privateprotected 可以访问其他值的方法的想法,我认为这是糟糕的设计。 private 应该表示 private[this]。如果你需要跨值访问,我认为你应该声明private[my-package],即使这意味着在你的情况下选择一个通用的基础包。

    【讨论】:

    • 我基本同意,这通常是“组合优于继承”的问题。无论如何,在我目前的情况下(就像在许多其他情况下一样),我受到了很久以前在遥远星系中编写的代码的限制......
    猜你喜欢
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    • 2020-05-02
    • 2011-03-11
    • 2011-12-20
    • 2017-12-09
    • 1970-01-01
    • 2020-07-01
    相关资源
    最近更新 更多