1

我正在使用一个 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;
}

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

我想知道这种情况是否有任何复杂的方法或通用模式(比如一些带有隐含的魔法或其他东西?)。

谢谢!

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 回答