Scala魔法使私人/受保护的成员可见?

时间:2012-05-25 20:06:56

标签: scala visibility

我正在使用API​​,其中的特性如下:

package pkg

trait Trait { 
  private[pkg] def f = ...
  private[pkg] val content = ...
}

我想在我的代码中使用来自Jar文件的API访问变量content和函数f(因此我无法修改原始代码以删除private定义)。

我能够提出的第一个解决方案是在同一个包中创建一个新的 bridge 类,这有助于我访问私有/受保护的成员函数,如下所示:

package pkg

trait PkgBridge {
  def f = Trait.f
  def getContent(t : Trait) = t.content;
}

这样我可以从我的代码中调用包私有成员。

我想知道在这种情况下是否有任何复杂的方式或共同的模式(比如某些带有暗示的魔法?)。

谢谢!

1 个答案:

答案 0 :(得分:5)

你正在做的事情,可能是一种很好的方式,并且不鼓励。

如果某些软件包是私有的,则可能是一个实现细节,其接口未被充分指定,以免将任何人暴露给它以允许它完全私密。所以要小心!可能有充分的理由不这样做。

除了反射之外,Scala中获取包私有内容的唯一方法是在该包中,因此您的方法是合适的。

请注意,此替代方案也可能有用:

package pkg {
  trait TraitBridge extends Trait {
    def fBridge = f
    def contentBridge = content
  }
}

然后你可以

class MyClass extends TraitBridge { ... }

专门选择您想要访问的扩展程序(在备用名称下)。