我最近看到了几个Scala问题(例如这里,这里和这里),它们要求使用代理,并且它在我自己的工作中不止一次出现.Scala库有许多代理特征(14,如果我计算正确的话).
代理类/特征通常包含许多样板:
class FooProxy(val self: Foo) extends Foo {
// added behavior
def mymethod = ...
// forwarding methods
def method1 = self.method1
def method2(arg: String) = self.method2(arg)
...
}
trait Foo {
def method1: Unit
def method2(arg: String): Unit
}
Run Code Online (Sandbox Code Playgroud)
我的第一个想法是定义一个Proxy[T]可以如下使用的特征:
class FooProxy(val self: Foo) extends Proxy[Foo] {
// added behavior
def mymethod = ...
}
Run Code Online (Sandbox Code Playgroud)
哪里trait Proxy[T] extends T.当然,如果Proxy没有编译器魔法,实际上不可能定义特征.
我的下一个想法是寻找一个编译器插件(这种功能显然不在现有的编译器中,或者这14个代理特性的来源会小得多).果然,我找到了Kevin Wright的AutoProxy插件.该插件旨在整齐地解决代理问题,以及其他用例(包括动态混合):
class FooProxy(@proxy val …Run Code Online (Sandbox Code Playgroud) Scala的集合库包含了代理IterableForwarder,TraversableForwarder,SeqForwarder和代理一样IterableProxy,MapProxy,SeqProxy,SetProxy,TraversableProxy,等代理和代理两种委托收集方法到底层集合对象.这两者之间的主要区别在于转发器不会转发会创建相同类型的新集合对象的调用.
在哪种情况下,我更喜欢这些类型中的一种?货运代理为何以及何时有用?如果他们是有用的,为什么会有不MapForwarder和SetForwarder?
我假设如果想要使用其他方法为集合构建包装器或者对标准集合进行操作,则最常使用代理.