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

标签 scala inheritance access-modifiers

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

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. 使用包范围:不会起作用,因为我打算在不同的包中有许多 B

还有其他办法吗?

最佳答案

怎么样:

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],即使这意味着在您的情况下选择一个公共(public)基础包。

关于Scala:如何使子类(在其他实例上)可以访问 protected 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34535095/

相关文章:

scala - 简化 Scala 中的 Option[Boolean] 表达式

Java如何使方法参数接受子类类型和父类(super class)

c# - 如何在 C# 中访问 protected 方法

scala - 为什么我不能在 Scala 子类中分配给 var?

.net - 为什么模块中的这个公共(public)函数无法访问

c# - 如何在 C# 中使属性 protected 和内部?

java - Scala getters/setters - 最佳实践?

java - 当从 Collection 生成源时,Flink 不进行检查点,BucketingSink 会将文件置于挂起状态

string - Scala:如何计算某个索引中唯一项的出现次数?

c++ - 扩展现有的 C++ 类