/ / Zdedenie metódy rovnakého mena z rozdielnych znakov - java, scala, dedičnosť, vlastnosti

Zdedenie metódy rovnakého mena z rozdielových znakov - java, scala, dedičnosť, vlastnosti

Mám znak, ktorý rozširuje ďalšie dva znaky, ktoré majú rovnaký názov pre funkciu, ale je trochu iná ako vo vnútri, chcem vedieť, ako môžem vedieť, ktorá funkcia bude vyvolaná?

Mám rys B ktorý má print(), a znak C ktorý má print(), ak zdedím obidve takto:

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

každá tlač tlačia niečo iné, ktorá tlač bude vyvolaná?

odpovede:

6 pre odpoveď č. 1

V konkrétnom prípade, keď máte konflikty s názvami, dostanete chybu pri kompilácii D je implementujúca trieda:

class D extends A with C with B

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

Uvidíte:

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

Avšak, ak pomôžeme kompilátor pridaním override print() na D, a zavolajte super.print(), vytlačí posledný znak v línii, ktorá podporuje a print metóda, t.j .:

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

Dostali sme "svet" B a C:

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

Dostali sme "ahoj".


1 pre odpoveď č. 2

Jeden z najdôležitejších vlastností znakov vpôvodný dokument Schärli, Ducassé, Nierstrasz, Black Paper je riešenie konfliktov prostredníctvom premenovania a skrývania. Táto funkcia úplne chýba v vlastnostiach Scala.

Vo Scale sú konflikty jednoducho zakázané. Zisťujú a odmietajú typový systém. (Originálny papier bol v kontexte Smalltalku, ktorý nemá typový systém, takže bol použitý iný prístup.)


0 pre odpoveď č. 3

Kompilátor programu Scala vám poskytne chybu kompilácie.

Prečo to nevidíš sami pomocou služby 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

Myslím, že môžete ľahko pochopiť pomocou chyby kompilátora