Новые экземпляры украшенных экземпляров - PullRequest
0 голосов
/ 04 января 2011

У меня есть набор черт декоратора (для простоты здесь только черта T), смешивающихся в классах (здесь подклассы A).

<code>trait T { def i: Int }
abstract class A
type AT = A with T
class B extends A
// class C extends A
// class D extends A
// ...
Теперь у меня есть экземпляр a, например, класс B, который я обрабатываю как экземпляр типа AT (вместе с другими A -подклассами-AT -инстанциями в Seq[AT]).
<code>val a: AT = new B with T { val i = 8 }
Как я могу в общем украсить, как это:
<code>def toAT(a: A, i: Int): AT = {
 // how to ???
}
Очевидное решение, о котором я подумал:
<code>trait T { def i: Int }
abstract class A {
  def asAT(i: Int): AT
}
class B extends A {
  def asAT(ii: Int): AT = new B with T { val i = ii }
}
type AT = A with T
def toAT(a: A, i: Int): AT = a.asAT(i)
Но я не хочу загрязнять мои классы B, C, ..., Z новым методом, и есть другие украшения, поэтому для каждой комбинации декораций мне нужен новый метод для всех подклассов! Есть ли более общий способ?

EDIT: Пример, почему мне нужен метод toAT, но все же с очевидным подходом решения сверху в терминах метода redecorated:

<code>trait T { def b: Boolean}
type AT = A with T
abstract class A(val i: Int) {
  def changedBy(x: Int): A
  def redecorated(oldAT: AT): AT
}
class B(x: Int) extends A(x) {
  def changedBy(x: Int): A = new B(i * x) 
  def redecorated(oldAT: AT): AT = new B(i) with T { val b = oldAT.b }
}
class C(x: Int) extends A(x) {
  def changedBy(x: Int): A = new C(i * x * x) 
  def redecorated(oldAT: AT): AT = new C(i) with T { val b = oldAT.b }
}
val b = new B(1) with T { val b = true  }
val c = new C(1) with T { val b = false }
val x = 8
val res: Seq[AT] = Seq(b,c) map { at => at.changedBy(x).redecorated(at) }

1 Ответ

2 голосов
/ 04 января 2011

В принципе, вы не можете этого сделать.

Одной из альтернатив является использование плагина auto proxy , Kevin Wright . См. Также здесь и здесь для получения дополнительной информации об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...