Scala:如何使子类(在其他实例上)可以访问受保护的方法?

Posted

技术标签:

【中文标题】Scala:如何使子类(在其他实例上)可以访问受保护的方法?【英文标题】:Scala: How to make a protected method accessible to sub-classes (on other instances)? 【发布时间】: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()

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

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

还有其他方法吗?

【问题讨论】:

【参考方案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],即使这意味着在你的情况下选择一个通用的基础包。

【讨论】:

我基本同意,这通常是“组合优于继承”的问题。无论如何,在我目前的情况下(就像在许多其他情况下一样),我受到了很久以前在遥远星系中编写的代码的限制......

以上是关于Scala:如何使子类(在其他实例上)可以访问受保护的方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何使类的成员只能在任何包的子类中访问?

scala言语基础学习六

面向对象(上)

iOS 实例变量修饰符

Scala的类层级讲解

接口访问权限