3

有没有办法做这样的事情:

scala> trait Foo { def f:Int=0 }
defined trait Foo

scala> class FooImpl extends Foo { override val f = 1 }
defined class FooImpl

scala> class Bar(foo:Foo) extends Foo{ import foo._ }
defined class Bar

scala> (new Bar(new FooImpl)).f
res2: Int = 0

scala> trait Foo { def f:Int }
defined trait Foo

scala> class Bar(foo:Foo) extends Foo{ import foo._ }
<console>:8: error: class Bar needs to be abstract, since method f in trait Foo of type => Int is not defined
       class Bar(foo:Foo) extends Foo{ import foo._ }
             ^

scala> 

...以某种方式导致子类通过导入覆盖父方法?基本上我认为能够在没有所有打字的情况下使用组合会很有趣。只是好奇这样的事情是否可能。

4

2 回答 2

3

您真正需要的是一种将方法实现委托给成员的方法。

该问题已在此处解决:Scala 中的代理/代表

基本上,有一种使用宏的方法。可以在这里找到一个实现:https ://github.com/adamw/scala-macro-aop

上面提供了一个@delegate 宏注解,它可以应用于一个数据成员,以使编译器生成代码以将方法调用委托给该成员。请注意,宏注释是为 Scala 2.11 计划的实验性功能,但您可以使用 Macro Paradise 编译器插件将它们与 Scala 2.10 一起使用。

于 2013-09-21T00:58:13.927 回答
1

自键入在这里可以提供帮助(具体取决于您将如何使用这些类——这不是实例的组合,而是类型的更多组合):

trait Foo { def f:Int }

trait FooImpl extends Foo { override val f = 1 } // Needs to be a trait to be mixed in.

class Bar {
  this: Foo =>  // This requires that any Bar instance must mix in a Foo (must 'be' a Foo)
}

然后您可以实例化并使用您的 Bar 实例,类似于以下内容:

scala> (new Bar with FooImpl).f
res1: Int = 1
于 2013-09-20T23:23:51.140 回答