1

私は次のように特性が与えられるAPIを使用しています:

package pkg

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

contentJar ファイルの API を使用して、コード内の変数と関数にアクセスしたいf(そのため、元のコードを変更してprivate定義を削除することはできません)。

最初の解決策として思いついたのは、同じパッケージに新しいブリッジクラスを作成することです。これにより、次のようなプライベート/保護されたメンバー関数にアクセスできます。

package pkg

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

このようにして、コードからパッケージのプライベート メンバーを呼び出すことができます。

この種の状況に洗練された方法や一般的なパターンがあるかどうか疑問に思っていました (暗黙の魔法など)。

ありがとう!

4

1 に答える 1

6

あなたがしていることはうまくいき、おそらく他の方法と同じくらい良い方法であり、落胆します.

何かがパッケージ プライベートである場合、それはおそらく実装の詳細であり、インターフェイスが十分に指定されていないため、誰かに公開されたり、完全にプライベートになったりする可能性があります。ので注意してください!これを行わない正当な理由があるかもしれません。

リフレクションは別として、Scala 内でパッケージのプライベート コンテンツを取得する唯一の方法は、そのパッケージ内にあることです。そのため、あなたの方法は適切なものです。

この代替手段も役立つ場合があることに注意してください。

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

そして、あなたはすることができます

class MyClass extends TraitBridge { ... }

(別名で)アクセスしたい拡張機能を具体的に選択します。

于 2012-05-25T20:15:44.863 に答える