2011-07-27 6 views
21

私は、混在すると、メソッドのデフォルト定義を元のメソッドを呼び出すものに置き換えて、それを操作する特性を作成しようとしています。結果。スカラの自己型付き形質でスーパークラスのメソッドを呼び出す

は、ここで私がやろうとしているものです:

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

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

class Quux extends Foo with OtherStuff 

これは、私はそれは、その後、(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 

しかしOtherStuffを定義するとき、私はoverrideを使用している場合、私が手:: - 残念ながら、それはそのように動作していない私が得るものはある

<console>:7: error: method bar overrides nothing 
     override def bar() : String = self.bar() + " with OtherStuff" 

それがでメソッドをオーバーライドすることは可能です形質を使った自己型?ない場合は、特色であることをOtherStuffを変更しますextends Fooその代わりにFooの自己型を持つ1私はScalaの2.7で働いている

class WhatEver extends Foo with Xyz with Pqr with OtherStuff with Abc 

ようなことを言って存在するすべてのコードに悪い何でもします。 7これはsbtビルドルールであり、まだsbtプロジェクトを0.10.xバージョンにアップグレードしていないためです。 (依存しているプラ​​グインはまだ準備ができていません)

答えて

29

あなたはabstract overrideが必要です。

trait OtherStuff extends Foo {         
    abstract override def bar() = super.bar() + " with OtherStuff" 
} 

次に、class Quux extends Foo with OtherStuffは何をしますか。

This articleが対象です。

+3

OtherStuffが私のロジック内のFooでない場合はどうなりますか? extendig Fooのない別の解決策はありませんか?または私はここで自己タイピングを虐待していますか? – Radian

+0

@Dupont:クラスQuuxはOtherStuffを拡張してFooを継承から取得するのではなく、FooをOtherStuffで拡張する必要があるのはなぜですか? – polo

0

またはあなたが行うことができ、次の

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

class Quux extends Foo with OtherStuff 
(new Quux).bar(" with other stuff") 

のような過負荷 形質がfooで混合されたときに、自己の型注釈で、OtherStuffで定義された「他のものは」フーの一部ですもの、サブタイプの関係ではなく、

+2

無限に再帰関数を定義しました。 –

+2

@TonyK .: 2つの 'bar'メソッドのシグネチャが異なるため –

関連する問題