我正在使用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;
}
这样我可以从我的代码中调用包私有成员。
我想知道在这种情况下是否有任何复杂的方式或共同的模式(比如某些带有暗示的魔法?)。
谢谢!
答案 0 :(得分:5)
你正在做的事情,可能是一种很好的方式,并且不鼓励。
如果某些软件包是私有的,则可能是一个实现细节,其接口未被充分指定,以免将任何人暴露给它或以允许它完全私密。所以要小心!可能有充分的理由不这样做。
除了反射之外,Scala中获取包私有内容的唯一方法是在该包中,因此您的方法是合适的。
请注意,此替代方案也可能有用:
package pkg {
trait TraitBridge extends Trait {
def fBridge = f
def contentBridge = content
}
}
然后你可以
class MyClass extends TraitBridge { ... }
专门选择您想要访问的扩展程序(在备用名称下)。