Добавление определенной Черты к Классу во время выполнения - PullRequest
3 голосов
/ 19 ноября 2010

У меня есть черта "Foo" с некоторыми методами.Я хочу смешать эту черту с любым классом.Но я не хочу писать что-то вроде

val b = new Bar with Foo

Мне нужно что-то вроде того, где я просто прохожу класс, и это смешивается с Foo.Я хочу смешивать только с этой чертой, то есть исправлено, что все классы должны смешиваться только с чертой Foo.

val b = new Factory(Bar) //Factory returns instance with trait Foo

Я нашел эту запись , но я не уверен.

Что-то подобное возможно в scala?

1 Ответ

4 голосов
/ 19 ноября 2010

В настоящее время лучшим решением является реализация Foo примерно так:

class Foo(bar:Bar) {
    ...
}
object Foo {
    def apply(bar:Bar) = new Foo(bar)
    implicit def backToBar = this.bar
}

Тогда используйте его как

val foo = Foo(myBar)

Для любых имен методов, которые совместно используются между Foo и Bar, будет использоваться версия в Foo (как с перегрузкой в ​​mixin). Любые другие методы, вариант на Bar будет использоваться.

Техника не идеальна, методы в Bar будут вызывать только другие методы, определенные в Bar, и никогда не "перегружают", определенные в Foo. В остальном это очень близко к вашим потребностям.

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