我正在尝试在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中是可能的吗?
发布于 2011-10-23 22:30:12
虽然scala中有结构化类型,但我不认为您可以对任何具有greet方法的类型执行此操作,而是对特定特征或类中的greet方法执行此操作。
然后,如果你想让你的例程改变一个还没有定义的例程,用abstract overrid调用它,它必须被标记为abstract override,而不是简单的覆盖。
那将是
trait Greeter { def greet }
trait First extends Greeter {
abstract override def greet = {
super.greet
println("Hi, I'm first")
}
}然后你就可以有greet定义了
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您可能想要阅读this article。
发布于 2011-10-24 15:44:56
我相信你可以用结构化的self类型做到这一点:
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然后,您可以在Foobar中重写greet方法(但我不知道这是什么用途):
trait Foobar {
this: { def greet() } => // self type
override def greet() = { println("mygreet") }
def go() = greet()
}
class Barbar extends Foobarhttps://stackoverflow.com/questions/7866571
复制相似问题