2013-07-24 54 views
4

有沒有一種方法來指定一個特徵必須提供一個方法的具體實現?Force Scala特質實現某種方法

鑑於一些混入

class A extends B with C { 
    foo() 
} 

該程序可以編譯,如果任一AB,或C工具foo()。但是我們怎麼能強制,例如B包含foo的實現呢?

回答

9

你可以做到以下幾點:

class A extends B with C { 
    super[B].foo() 
} 

如果B實現foo這隻會編譯。雖然它(可能)引入了一些不直觀的耦合,但謹慎使用。此外,如果A重寫foo,則將調用Bfoo

一個恕我直言,有效的使用情況是conflict resolution

trait B { def foo() = println("B") } 
trait C { def foo() = println("C") } 
class A extends B with C { 
    override def foo() = super[B].foo() 
} 

如果你想確保B聲明foo,您可以使用類型歸屬:

class A extends B with C { 
    (this:B).foo() 
} 

這隻會編譯如果B聲明foo(但它可能在CA)。