首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala中的Mixins

Scala中的Mixins
EN

Stack Overflow用户
提问于 2011-10-23 22:06:14
回答 2查看 570关注 0票数 2

我正在尝试在Scala中创建一个特征:

代码语言:javascript
复制
trait First {
  override def greet() {
    super.greet
    println("First")
  }
}

但是编译器说:

代码语言:javascript
复制
scala/scala_learning/traits_hierarchy.scala:3: error: value greet is not a member of java.lang.Object with ScalaObject
    super.greet
          ^

但是我想用这个特性来扩展一些超类具有方法的类。这在scala中是可能的吗?

EN

回答 2

Stack Overflow用户

发布于 2011-10-23 22:30:12

虽然scala中有结构化类型,但我不认为您可以对任何具有greet方法的类型执行此操作,而是对特定特征或类中的greet方法执行此操作。

然后,如果你想让你的例程改变一个还没有定义的例程,用abstract overrid调用它,它必须被标记为abstract override,而不是简单的覆盖。

那将是

代码语言:javascript
复制
trait Greeter { def greet }

trait First extends Greeter {
  abstract override def greet = {
    super.greet
    println("Hi, I'm first")
  }
}

然后你就可以有greet定义了

代码语言:javascript
复制
class StandardGreeter(greeting: String) extends Greeter {
  def greet = println(greeting)
}

请注意,第一个是在不了解StandardGreeter的情况下定义的。你在新的类中加入

代码语言:javascript
复制
class FirstGreeter(greeting: String) extends StandardGreeter(greeting) with First

或使用直接创建实例

代码语言:javascript
复制
new StandardGreeter("whatever") with First

您可能想要阅读this article

票数 5
EN

Stack Overflow用户

发布于 2011-10-24 15:44:56

我相信你可以用结构化的self类型做到这一点:

代码语言:javascript
复制
trait Foobar {
    this: { def greet() } => // self type
    def go() = greet()
}
class Barbar extends Foobar { def greet() = { println("hello") }}

您正在定义Foobar只能扩展定义了greet()方法的类。使用REPL:

代码语言:javascript
复制
scala> trait Foobar { this: { def greet() } =>
     | def go() = greet()
     | }
defined class Foobar

scala> new Foobar()
<console>:9: error: class Foobar cannot be instantiated because it does not conform to its self-type Foobar with AnyRef{def greet(): Unit}
              new Foobar()
              ^

scala> class Barbar extends Foobar { def greet() = { println("hello") }}
defined class Barbar

scala> new Barbar().go
hello

然后,您可以在Foobar中重写greet方法(但我不知道这是什么用途):

代码语言:javascript
复制
trait Foobar {
    this: { def greet() } => // self type
    override def greet() = { println("mygreet") }
    def go() = greet()
}
class Barbar extends Foobar
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7866571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档