相关疑难解决方法(0)

为什么Scala特性可以扩展一个类?

我看到Scala中的特性与Java中的接口类似(但Java中的接口扩展了其他接口,它们不扩展类).我在SO上看到了一个关于特征使用的例子,其中特征扩展了一个类.

这样做的目的是什么?为什么traits可以扩展类?

scala traits

53
推荐指数
1
解决办法
1万
查看次数

在scala中的自键型特征中调用超类的方法

我正在尝试创建一个特性,当混入时,将用一个调用原始方法的方法替换方法的默认定义,然后操纵结果.

这是我正在尝试做的事情:

class Foo {
  def bar() : String = "Foos bar"
}

trait OtherStuff {
  self : Foo =>
  def bar() : String = self.bar() + " with OtherStuff"
}

class Quux extends Foo with OtherStuff
Run Code Online (Sandbox Code Playgroud)

如果按照我想要的方式工作,那么(new Quux).bar现在就会回归Foos bar with OtherStuff.不幸的是,它不起作用 - 我得到的是:

<console>:6: error: error overriding method bar in class Foo of type ()String;
 method bar in trait OtherStuff of type ()String needs `override' modifier
       class Quux extends Foo with OtherStuff
Run Code Online (Sandbox Code Playgroud)

但如果我override在定义时使用 …

scala scala-2.7

22
推荐指数
1
解决办法
6869
查看次数

如何在通过特征覆盖方法时调用super方法

看起来可以在具有如下特征的类上更改方法的实现:

trait Abstract { self: Result =>
    override def userRepr = "abstract"
}

abstract class Result {
    def userRepr: String = "wtv"
}

case class ValDefResult(name: String) extends Result {
    override def userRepr = name
}

val a = new ValDefResult("asd") with Abstract
a.userRepr
Run Code Online (Sandbox Code Playgroud)

现场代码可在此处获取:http://www.scalakata.com/52534e2fe4b0b1a1c4daa436

但是现在我想调用前面的或超级实现的函数,如下所示:

trait Abstract { self: Result =>
    override def userRepr = "abstract" + self.userRepr
}
Run Code Online (Sandbox Code Playgroud)

要么

trait Abstract { self: Result =>
    override def userRepr = "abstract" + super.userRepr
}
Run Code Online (Sandbox Code Playgroud)

但是,这些替代方案都没有编译.知道如何实现这一目标吗?

polymorphism scala traits mixins

19
推荐指数
3
解决办法
1万
查看次数

标签 统计

scala ×3

traits ×2

mixins ×1

polymorphism ×1

scala-2.7 ×1