私は、関数の名前は同じで、内部とは少し異なる2つの他の特性を拡張する特性を持っています。どの関数が呼び出されるのか?相違形質から同じ名前のメソッドを継承する
私は、このようにそれらの両方を継承する場合、私は、print()
を持っているprint()
を持っている特性B
、および特性C
を持っている:
trait A extends B with C {
def print()
}
印刷が呼び出される何か他のものを印刷し、各プリント、?
私は、関数の名前は同じで、内部とは少し異なる2つの他の特性を拡張する特性を持っています。どの関数が呼び出されるのか?相違形質から同じ名前のメソッドを継承する
私は、このようにそれらの両方を継承する場合、私は、print()
を持っているprint()
を持っている特性B
、および特性C
を持っている:
trait A extends B with C {
def print()
}
印刷が呼び出される何か他のものを印刷し、各プリント、?
名前の競合が発生する特定のケースでは、コンパイル時エラーが発生します。 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
、我々はD
にoverride 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で最後の特色。私たちはB
とC
を切り替えた場合:
class D extends A with C with B {
override def print(): Unit = super.print()
}
私たちは、 "hello" を得ると思います。
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における形質の最も重要な特徴の
つを使用して理解することができると思う、黒い紙は名前の変更や隠れを通じて紛争解決です。この機能はScalaの特性には完全に欠けています。
Scalaでは、競合は許可されません。それらはタイプシステムによって検出され、拒否されます。 (元の論文は、型システムを持たないSmalltalkの文脈にあったので、別のアプローチが使われていました)。
私はあなたが明示的にできることを付け加えたいと思います。 C {override def print():ユニット=スーパー[B] .print()} '。 –