【发布时间】:2013-09-26 08:22:29
【问题描述】:
有没有办法做这样的事情:
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>
...以某种方式导致子类通过导入覆盖父方法?基本上,我认为能够在没有所有打字的情况下使用组合会很有趣。只是好奇这样的事情是否可能。
【问题讨论】:
-
是的,我意识到这一点,只是想知道是否有任何方法可以使这样的事情发挥作用。它可以使具有大量抽象方法的特征的组合变得容易。
-
因为我想要从现有实例中实现...而实际上该特征可能有 20 多种方法。由于大多数特征的大小,Scala 中的组合通常需要大量输入。我的手累了。
-
您可能想查看 AutoProxy 编译器插件。这个问题有一些信息:Proxies / delegates in Scala
-
@DaoWen 这个问题已经很老了,但我只是添加了一个反映最近发展的答案。如果这方面还有其他工作,我会鼓励其他人也这样做。
-
@Brian
import只是将符号带入您的词法命名空间,这是正确的(想象一下由于粗心的通配符导入而意外为您实现方法的混乱)。代表似乎是一个更有希望的解决方案。但是,与此同时,您应该考虑“Scala 中的组合......需要大量输入”,或者您的用例是否需要不同的 type 组合(请参阅@Shadowlands 答案) .
标签: scala inheritance overriding