2012-02-16 11 views
6

Mam następujący kod:Scala - mieszanie w cechę z importu (import dziedziczących)

trait A { 
    import org.somepackage.C._ 
} 

class B extends A { 
    def getValue = value 
       ^^^^^ 
} 

object C { 
    var value = 5 
} 

Wartość w klasie B nie jest widoczny, co oznacza, że ​​nieodłącznym import klasy A nie odziedziczył B, chociaż value jest doskonale widoczny wewnątrz A. Jak osiągnąć efekt dziedziczenia importu, aby uniknąć bezpośredniego importowania tych samych rzeczy w wielu klasach, w których miesza się cecha A?

+1

Możliwy duplikat [W Scala, w jaki sposób przekazywać instrukcje importu do podklas?] (Http://stackoverflow.com/questions/7252126/in-scala-how-do-i-pass-import-statements- through-to-subclasses) – Suma

Odpowiedz

11

Przywóz nie będący obiektem pierwszej klasy nie wykazuje zachowania, którego się spodziewasz. Można zamiast zrestrukturyzować swój projekt thusly coś osiągnąć w pobliżu:

trait A with C { 

} 

class B extends A { 
    def getValue = value // Now this will work. 
} 

trait C { 
    var value = 5 
} 

object C extends C 

Ten idiom jest używany w Scalaz 6 użytkowników podatkowych z jak najmniejszej ilości importu, jak to możliwe.

+0

Wygląda na to, że działa tylko wtedy, gdy 'C' jest cechą. Co jeśli 'C' jest czymś innym (w moim przypadku' C' jest metodą)? Kiedy próbuję użyć tego wzorca, po prostu mówi "Nie mogę rozwiązać symbolu C" (gdzie 'C' jest nazwą metody, którą w innym przypadku importowałbym przez' com.xyz.C'). – socom1880

+0

Co więcej, gdybym chciał dołączyć wszystko, jak w "com.xyz._"? – socom1880

+0

W obu powyższych przypadkach należy przenieść implementację do cechy, a następnie obiekt, który po prostu rozszerza tę cechę, podobnie jak w odpowiedzi. Cechy mogą być rozszerzone, aby "mieszać w", obiekty nie mogą. Aby uwzględnić wszystko, np. Com.xyz._, musisz zaimplementować com.xyz za pośrednictwem obiektu pakietu - podobnie jak obiekt pakietu, który jest implementowany przez rozszerzenie cechy, która ma wszystkie rzeczywiste implementacje. Następnie możesz użyć tej cechy, aby również "wymieszać się" w innym miejscu. – RD1

Powiązane problemy