В настоящее время лучшим решением является реализация 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
. В остальном это очень близко к вашим потребностям.