2016-10-25 38 views
6

Mam cechę, która rozszerza dwie inne cechy, które mają tę samą nazwę dla funkcji, ale jest nieco inna niż wewnątrz, chcę wiedzieć, skąd mam wiedzieć, która funkcja zostanie wywołana ?Dziedziczenie tej samej nazwy z cech różnicowych

mam cecha B że ma print() oraz cechę C który ma print(), jeśli dziedziczą oboje tak:

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

każdy druk druk coś innego, który zostanie wywołany drukować?

Odpowiedz

6

W szczególnym przypadku, gdy występują konflikty nazw, pojawi się błąd czasu kompilacji. Zakładając D jest klasa wykonawcze:

class D extends A with C with B 

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

Zobaczysz:

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 

Jeśli jednak pomóc kompilator dodając override print() do D i uczynić go nazwać super.print() będzie drukować ostatnia cecha w Linage które obsługują print metody, a mianowicie:

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() 
} 

Chcemy dostać „świat” . Jeśli mamy włączony B i C:

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

Chcemy dostać "cześć".

+1

Dodałbym, że możesz być jednoznaczny: 'klasa D rozszerza A na B z C {przesuń def print(): Jednostka = super [B] .print()} '. –

0

Kompilator Scala umożliwia błąd kompilacji.

Dlaczego nie widzisz tego sam, używając 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 

myślę, że można łatwo zrozumieć przy użyciu błąd kompilatora

1

Jedną z najważniejszych cech cech w oryginalnym Schärli, Ducasse, Nierstrasz, Czarny papier rozwiązywania konfliktów poprzez zmianę nazwy i ukrywać. Ta funkcja jest całkowicie nieobecna w Cechach Scali.

W Scali konflikty są po prostu niedozwolone. Są wykrywane i odrzucane przez system typów. (Oryginalny artykuł był w kontekście Smalltalk, który nie ma systemu typu, więc zastosowano inne podejście).