2016-10-25 12 views
6

私は、関数の名前は同じで、内部とは少し異なる2つの他の特性を拡張する特性を持っています。どの関数が呼び出されるのか?相違形質から同じ名前のメソッドを継承する

私は、このようにそれらの両方を継承する場合、私は、print()を持っているprint()を持っている特性B、および特性Cを持っている:

trait A extends B with C { 
    def print() 
} 

印刷が呼び出される何か他のものを印刷し、各プリント、?

答えて

6

名前の競合が発生する特定のケースでは、コンパイル時エラーが発生します。 Dと仮定すると実装するクラスです:

class D extends A with C with B 

def main(args: Array[String]): Unit = { 
    val d = new D 
    println(d.print()) 
} 

あなたが表示されます。しかし

Error:(25, 9) class D inherits conflicting members: 
    method print in trait B of type()Unit and 
    method print in trait C of type()Unit 
(Note: this can be resolved by declaring an override in class D.) 
    class D extends A with B with C 

、我々はDoverride print()を追加することで、コンパイラを助ける、それがsuper.print()を呼び出す作る場合は、それが印刷されます

trait A { } 

trait B { def print() = println("hello") } 

trait C { def print() = println("world") } 

class D extends A with B with C { 
    override def print(): Unit = super.print() 
} 

私たちは「世界」を取得したい:print方法、すなわちをサポートLINAGEで最後の特色。私たちはBCを切り替えた場合:

class D extends A with C with B { 
    override def print(): Unit = super.print() 
} 

私たちは、 "hello" を得ると思います。

+1

私はあなたが明示的にできることを付け加えたいと思います。 C {override def print():ユニット=スーパー[B] .print()} '。 –

0

Scalaコンパイラでコンパイルエラーが発生します。

なぜあなたはScala REPLを使用して自分自身を見ないのですか?

scala> trait B { def print(): Unit = println("B") } 
defined trait B 

scala> trait C { def print(): Unit = println("C") } 
defined trait C 

scala> trait A extends B with C { def foo = print() } 
cmd11.sc:1: trait A inherits conflicting members: 
    method print in trait B of type()Unit and 
    method print in trait C of type()Unit 
(Note: this can be resolved by declaring an override in trait A.) 
trait A extends B with C { def foo = print() } 
    ^
Compilation Failed 

は、私はあなたが簡単にコンパイルエラーの元Schärli、デュカス、Nierstraszにおける形質の最も重要な特徴の

1

つを使用して理解することができると思う、黒い紙は名前の変更や隠れを通じて紛争解決です。この機能はScalaの特性には完全に欠けています。

Scalaでは、競合は許可されません。それらはタイプシステムによって検出され、拒否されます。 (元の論文は、型システムを持たないSmalltalkの文脈にあったので、別のアプローチが使われていました)。

関連する問題