Новые конструкторы для классов с богатой оболочкой Scala (неявной)

В Scala вы можете «добавлять новые методы» к существующим классам, создавая класс-оболочку и используя «неявное определение» для преобразования исходного класса в расширенный класс-оболочку.

У меня есть библиотека Java для графики, в которой используется множество конструкторов с длинными списками чисел с плавающей запятой. Я хотел бы добавить к этим классам новые конструкторы с богатой оберткой, но это, похоже, не работает так, как описано выше для методов. Другими словами, я хотел бы иметь более простые конструкторы, но при этом иметь возможность использовать исходные имена классов, а не имена некоторых классов-оболочек, но в настоящее время я не вижу других вариантов.

Идеи?


person vertti    schedule 18.07.2011    source источник
comment
Разве вам не нужна фабрика?   -  person Ben Jackson    schedule 18.07.2011
comment
Это, наверное, лучшее решение - создать отдельную фабрику объектов.   -  person vertti    schedule 18.07.2011


Ответы (2)


Похоже, вы хотите использовать фабричные методы Scala apply (...), которые вы встраиваете в сопутствующий объект вашего класса.

Например, если у вас есть:

class Foo(val bar: Int, val baz: Int) {
  ... class definition ...
}

Вы можете добавить (в том же файле):

object Foo {
  def apply(bar: Int) = new Foo(bar, 0)
}

Имея это под рукой, создать новый экземпляр Foo, просто указав параметр bar, так же просто, как

val myBar = 42
val myFoo = Foo(myBar) // Note the lack of the 'new' keyword.

Это приведет к тому, что myFoo будет назначен экземпляр Foo, где bar = 42 и baz = 0.

person Shadowlands    schedule 18.07.2011
comment
да. @Janne, короче говоря, вы правы, вы просто не можете «эмулировать» новый конструктор, который вы бы вызывали с помощью new, но вместо этого вы можете использовать эту технику. - person Jean-Philippe Pellet; 18.07.2011
comment
Библиотека является сторонней библиотекой, поэтому я не хочу изменять там классы и думаю, по той же причине я не могу создавать объекты-компаньоны для этих классов? - person vertti; 18.07.2011

Да, вам нужна комбинация подхода «Pimp my Library» и применить фабричный метод.

person Alex Dean    schedule 30.09.2011