20

次のような特性を持つクラスのメソッドの実装を変更できるようです。

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

ライブコードはこちらから入手できます: http://www.scalakata.com/52534e2fe4b0b1a1c4daa436

しかし、次のような関数の以前の実装またはスーパー実装を呼び出したいと思います。

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

また

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

ただし、これらの代替手段はどれもコンパイルされません。これをどのように達成できるか考えていますか?

4

3 に答える 3

19

これが私が探していた答えです。Scala の機能で正しい方向を示してくれた Shadowlands に感謝しますabstract override

trait Abstract extends Result {
    abstract override def userRepr = "abstract " + super.userRepr
}

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

ライブ コードはこちらから入手できます: http://www.scalakata.com/52536cc2e4b0b1a1c4daa4a4

わかりにくいサンプル コードで申し訳ありません。私は Scala AST を扱うライブラリを作成していますが、名前を変更するほどのインスピレーションがありませんでした。

于 2013-10-08T02:32:13.427 に答える