我正在使用一个API,其中特征是这样的:
package pkg
trait Trait {
private[pkg] def f = ...
private[pkg] val content = ...
}
我想使用 Jar 文件中的 API 访问代码中的变量content
和函数f
(因此我无法修改原始代码以删除private
定义)。
能够想出的第一个解决方案是在同一包中创建一个新的桥类,这有助于我访问私有/受保护的成员函数,如下所示:
package pkg
trait PkgBridge {
def f = Trait.f
def getContent(t : Trait) = t.content;
}
这样,我就可以从我的代码调用包私有成员。
我想知道对于这种情况是否有任何复杂的方法或常见的模式(比如一些带有隐含的魔法或其他东西?
谢谢!
你正在做的事情可能和任何方法一样好,并且不鼓励。
如果某些东西是包私有的,那么它可能是一个实现细节,没有很好地指定接口,以冒着将任何人暴露给它的风险或允许它完全私有。 所以要小心! 可能有充分的理由不这样做。
除了反射之外,在 Scala 中获取包私有内容的唯一方法是在该包中,因此您的方法是一个合适的方法。
请注意,此替代方法也可能有用:
package pkg {
trait TraitBridge extends Trait {
def fBridge = f
def contentBridge = content
}
}
然后你可以
class MyClass extends TraitBridge { ... }
以专门选取要访问的扩展程序(在备用名称下)。