2011-09-21 14 views
25

Czy można utworzyć klasę z niezmiennym odnośnikiem do obiektu partnerskiego, czy musi to być var, który przypiszę po utworzeniu?Wywoływanie niezmiennych sparowanych obiektów

np.

class PairedObject (p: PairedObject, id: String) { 
    val partner: PairedObject = p // but I need ref to this object to create p! 
} 

lub w podobny sposób, w jaki sposób mogę utworzyć kolejną parę?

class Chicken (e: Egg) { 
    val offspring = e 
} 

class Egg (c: Chicken) { 
    val mother = c 
} 

Odpowiedz

25

Tutaj jest kompletnym rozwiązaniem problemu z kurczaka/Egg:

class Chicken (e: =>Egg) { 
    lazy val offspring = e 
} 

class Egg (c: =>Chicken) { 
    lazy val mother = c 
} 

lazy val chicken: Chicken = new Chicken(egg) 
lazy val egg: Egg   = new Egg(chicken) 

Należy pamiętać, że trzeba zapewnić wyraźne typy do chicken i egg zmiennych.

I PairedObject:

class PairedObject (p: => PairedObject, val id: String) { 
    lazy val partner: PairedObject = p 
} 

lazy val p1: PairedObject = new PairedObject(p2, "P1") 
lazy val p2: PairedObject = new PairedObject(p1, "P2") 
+0

Pomysłowy! Testowane ... działa –

+0

Dodałem także rozwiązanie dla obiektu PairedObject. Zauważyłem również, że vals dla "chicken" i "egg" nie muszą być leniwe. Ściśle nie trzeba uwzględniać typów dla obu, jak można wywnioskować. –

+9

To rozwiązanie zadziała, jeśli zostanie wprowadzone na najwyższym poziomie definicji "klasy" lub "obiektu", ale otrzyma niedozwolony błąd odniesienia do przodu, jeśli "kurczak" i "jajko" są zmiennymi lokalnymi (np. Wewnątrz funkcji). Rozwiązaniem, które działa w dowolnym zakresie, jest: 'lazy val (jajko: jajko, kurczak: kurczak) = ...', które może być samo-referencyjne. –

Powiązane problemy