2010-05-05 23 views
8

Verilen iki bağımsız özellikler:Oluşturma bağımsız özellikler

trait T1 { 
    def x = 42 
} 

trait T2 { 
    def x = 0 
} 

ben gibi bu iki özelliklerin bir sınıf karıştırmayı tanımlamak çalışırsanız:

error: overriding method x in trait T1 of type => Int; 
method x in trait T2 of type => Int needs `override' modifier 
class C extends T1 with T2 
    ^
one error found 
:
class C extends T1 with T2 

Bir derleyici hatası alıyorum

Şimdi, T1 ve T2'nin bağımsız olarak geliştirildiğini, dolayısıyla herhangi bir şeyi geçersiz kılmadıklarından dolayı geçersiz kılmadıklarını varsayalım. O zaman nasıl tanımlanabilir? Bunu beğendi:

class C extends T1 with T2 { 
    override def x = super.x 
} 

?

cevap

10

Bu, diamond problem olarak bilinir. Scala bu çözmek için iki yol vardır:

trait T1 { 
    def x = 0 
} 

trait T2 { 
    def x = 42 
} 

class C extends T1 with T2 { 
    override def x = super.x 
} 

class D extends T2 with T1 { 
    override def x = super.x 
} 

şimdi new C().x ararsanız Scala son karışık özelliğin uygulanmasını kullanır, çünkü 42 alacak. new D().x, bu arada 0 ürününü verecektir. Bu, elmas problemini çözmek için, hangi uygulamayı kullanmak istediğinizi açıkça tanımlamanız gerektiği anlamına gelir. aşağıdaki gibi

başka bir yol T2 içinde karıştırılmıştır son özellik, çünkü

trait T { 
    def x: Int 
} 

trait T1 extends T { 
    override def x = 0 
} 

trait T2 extends T { 
    override def x = 42 
} 

class C extends T1 with T2 

new C().x için bir çağrı hala 42 verecek fark C içinde x tanımlamak zorunda kalmamasıdır..

+0

Bu ilginç. Eğer 'x' in 'T1' ve 'T2' deki iki tanımı farklı tiplerde ise, kaçınılmaz bir problem gibi görünüyor. Scala'da türler eşleşmezse bu ad çakışmaları düzeltmek için akıllıca bir yol var mı? – Mike

+0

İlk örneğimi kullanın ve sonra 'C' yi aşağıdaki gibi tanımlayın: C sınıfı T1'i T2 ile uzatır {override def x = super [T1] .x} '. Elbette, süper [T2] .x' diyebilirsiniz. –

İlgili konular