2012-05-25 57 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