Scala混合蛋白
我试图在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
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