2012-08-14 75 views
1

我有一類來源,我不能修改:斯卡拉特質組成問題

class Foo { 

    def bar() = println("bar") 

} 

而且我想在運行時混入它的性狀

trait Zee { this: Foo => 

    abstract override def bar() = { 
    println("before bar") 
    super.bar() 
    } 
} 

這是扔是bar is not a member of Object with ScalaObject

我在做什麼錯了?是否可以在不修改Foo源代碼的情況下實現此目的?

最終客戶端代碼需要看起來像這樣:

val foo = new Foo with Zee 
foo.bar() // should print 'before bar' and then 'bar' 

回答

5

你Zee的特質有沒有超級性狀(除了ScalaObject隱性遺傳),因此超不包含定義爲bar並沒有什麼重寫或調用(super.bar)。

爲什麼你不寫這個沒有自引用?

class Foo { 

    def bar() = println("bar") 

} 


trait Zee extends Foo { 

    abstract override def bar() = { 
    println("before bar") 
    super.bar() 
    } 
} 
3

你可以擴展的類美孚在特質:

trait Zee extends Foo 

而且你的代碼將工作。

2

你的特質需要extend

trait Zee extends Foo { 
    abstract override def bar() = { 
    println("before bar") 
    super.bar() 
    } 
}