2012-05-25 58 views
1

我使用的其中一个特质被赋予这样的API:斯卡拉魔法使私人/受保护的成员可见?

package pkg 

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

我想访问我的代码变量content和功能f,使用API​​ JAR文件(所以我不能修改原始代码去除private定义)。

我能想出的第一个解决方案是建立在同一个包的新类,可以帮助我访问私有/受保护成员函数是这样的:

package pkg 

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

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

我想知道是否有任何复杂的方式或常见的模式,这种情况下(像一些魔术含有暗示或什么?)。

谢谢!

+2

你不觉得这些成员是隐藏的吗? –

+0

@ DanielC.Sobral在Rex Kerr的回答中看到我的评论。 – rlegendi

回答

5

你在做什么工作,可能是一种很好的方法来做任何事情,并且不鼓励。

如果事情是包private,它是可能对于其接口也没有指定足够好风险暴露任何人给它允许它是完全私有的实现细节。所以要小心!可能有很好的理由不这样做。

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

注意,这种替代可能是有用的:

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

,然后你可以

class MyClass extends TraitBridge { ... } 

专门去接您要访问的扩展(下替代名称) 。

+0

感谢您的回答。是的,我知道这是一种让人感到沮丧的做法(我来自Java世界),但有时候你根本无法做得更好。到目前为止,在过去的5年左右,我不得不使用一两个这样的解决方案,但现在我试图链接2个API,并且它们都有一些我需要的专用访问资源来完成这项工作。 – rlegendi