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

Scala:如何使子类(在其他实例上)可以访问受保护的方法?,scala,inheritance,access-modifiers,Scala,Inheritance,Access Modifiers,我正在尝试这样做: trait A[Out]{ 受保护的def foo():Out } 特征B扩展了A[Int] 类包装器b(b:b)扩展了b{ 覆盖受保护的def foo():Int=b.foo()+1 } 这将无法编译,因为WrapperB无法访问b.foo() 有几种方法可以解决这个问题,但这些方法对我不起作用: 使foo公开:不起作用,因为我希望它保持保护 使用包作用域:不起作用,因为我希望在不同的包中有许多Bs 还有别的办法吗?怎么样: trait A[Out] { protec

我正在尝试这样做:

trait A[Out]{
受保护的def foo():Out
}
特征B扩展了A[Int]
类包装器b(b:b)扩展了b{
覆盖受保护的def foo():Int=b.foo()+1
}
这将无法编译,因为
WrapperB
无法访问
b.foo()

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

  • 使
    foo
    公开:不起作用,因为我希望它保持
    保护
  • 使用包作用域:不起作用,因为我希望在不同的包中有许多
    B
    s
  • 还有别的办法吗?

    怎么样:

    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
    }
    

    我从来都不喜欢
    private
    protected
    可以访问其他值的方法,我认为这是一个糟糕的设计
    private
    应表示
    private[此]
    。如果您需要跨值访问,我认为您应该声明
    private[my package]
    ,即使这意味着在您的情况下选择一个公共的基本包。

    我基本同意,这通常是一个“组合重于继承”的问题。不管怎样,在我目前的情况下(和其他许多人一样),我一定会受到很久以前在遥远的银河系编写的代码的限制。。。