2016-10-25 25 views
6

Bir işlev için aynı ada sahip diğer iki özelliği de kapsayan bir özelliği var, ancak içten biraz farklı, hangi işlevi çağırılacağını nasıl bilebilirim bilmek istiyorum ? Ben özellik Bprint() ve ikisiyle de böyle miras ise, print() sahiptir özellik C sahip olduğunuFarklılık özelliklerinden aynı adlandırma yönteminin kalıtımı

adres:

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

yazdırmak başka bir şey yazdırmadan her baskı,

çağrılır?

cevap

6

Ad çakışmaları olduğunda, bir derleme zamanı hatası alırsınız. D varsayarsak uygulayan sınıftır:

class D extends A with C with B 

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

Göreceksin: Biz D bir override print() ekleyerek derleyici yardım ederse, Ancak

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 

ve super.print() çağırttırma, bu yazdırılır bir print yöntem yani destekleyen linage son özellik:

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

Biz alırdım "dünya" . Biz B ve C geçiş yaptıysanız:

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

Biz "Merhaba" iyi olur.

+1

Sadece açık olabileceğinizi ekledim: 'D sınıfı A ile B'yi uzatır C {defride def print(): Birim = süper [B] .print()} '. –

0

Scala derleyici, derleme hatası verir.

Scala REPL'yi kullanarak neden kendiniz göremiyorsunuz?

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 

Ben kolayca derleyici hatası orijinal Schärli, Ducasse, Nierstrasz içinde Özelliklerinin en önemli özelliklerinden

1

biri kullanılarak anlayabiliriz düşünüyorum Siyah kağıt yeniden adlandırılması ve gizleme yoluyla çatışma çözümü olduğunu. Bu özellik Scala'nın özelliklerinden tamamen yok.

Scala'da çakışmalara izin verilmez. Tip sistemi tarafından tespit edilir ve reddedilir. (Orijinal kağıt, bir tür sistemine sahip olmayan Smalltalk bağlamındaydı, bu yüzden farklı bir yaklaşım kullanıldı.)

İlgili konular