Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala混合蛋白_Scala - Fatal编程技术网

Scala混合蛋白

Scala混合蛋白,scala,Scala,我试图在Scala中创造一种特质: trait First { override def greet() { super.greet println("First") } } 但编译器说: scala/scala_learning/traits_hierarchy.scala:3: error: value greet is not a member of java.lang.Object with ScalaObject super.greet

我试图在Scala中创造一种特质:

trait First {
  override def greet() {
    super.greet
    println("First")
  }
}
但编译器说:

scala/scala_learning/traits_hierarchy.scala:3: error: value greet is not a member of java.lang.Object with ScalaObject
    super.greet
          ^

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

虽然scala中有结构类型,但我认为对于任何具有greet方法的类型都不能这样做,但是对于特定特性或类中的greet方法

然后,如果您想让您的例程更改一个尚未定义的例程,用super调用它,那么它必须被标记为
abstractoverrid
e,而不是简单地重写

那就是

trait Greeter { def greet }

trait First extends Greeter {
  abstract override def greet = {
    super.greet
    println("Hi, I'm first")
  }
}
然后你可以有一个新的定义

class StandardGreeter(greeting: String) extends Greeter {
  def greet = println(greeting)
}
请注意,第一个是在不了解StandardGreeter的情况下定义的。你在新的班级里加入了

class FirstGreeter(greeting: String) extends StandardGreeter(greeting) with First
或者直接使用创建实例

new StandardGreeter("whatever") with First

你可能想阅读。

我相信你可以通过结构自我类型来完成这一点:

trait Foobar {
    this: { def greet() } => // self type
    def go() = greet()
}
class Barbar extends Foobar { def greet() = { println("hello") }}
您正在定义Foobar只能扩展定义方法greet()的类。使用REPL:

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

好的,但是mixin从哪里来呢?@didierd
FooBar
可以是一种
trait
@Daniel。也许你对这个问题的理解有问题。我想重点是让greet call super.greet+其他东西,这通常是一个抽象覆盖。在这里,我们有一个结构上的限制,你可以混入其中,这不是什么了不起的壮举,但我们可以做一些类似于抽象覆盖的事情吗?@didierd。你说得对,我想用Foobar而不是课堂。你可能是对的,我们等着看他怎么说。
trait Foobar {
    this: { def greet() } => // self type
    override def greet() = { println("mygreet") }
    def go() = greet()
}
class Barbar extends Foobar