Недавно я видел несколько вопросов по 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
}
Моей первой мыслью было определитьProxy[T]
черта, которую можно использовать следующим образом:
class FooProxy(val self: Foo) extends Proxy[Foo] {
// added behavior
def mymethod = ...
}
, где trait Proxy[T] extends T
.Конечно, на самом деле невозможно определить черту Proxy
без магии компилятора.
Моей следующей мыслью было поискать плагин компилятора (такой возможности явно нет ни в существующем компиляторе, ни в исходниках).для этих 14 черт прокси было бы намного меньше).Конечно же, я нашел плагин Кевина Райта AutoProxy .Плагин предназначен для аккуратного решения проблемы с прокси, наряду с другими вариантами использования (включая динамические миксины):
class FooProxy(@proxy val self: Foo) { ... }
К сожалению, похоже, что работа над ним остановилась в ноябре (2009).Итак, мои вопросы
- Продолжается ли работа над плагином AutoProxy?
- Будет ли это найти путь к компилятору?
- Рассматриваются ли другие подходы??
- Наконец, указывает ли это на существенную слабость в Scala?В конце концов, нельзя ли определить черту
Proxy
с помощью макросов в стиле lisp?