Nested Classes
En Scala se puede definir una función dentro de una función o una clase dentro de otra clase:
import scala.collection.mutable.ArrayBuffer
class Network {
class Member(val name: String) {
val contacts = new ArrayBuffer[Member]
}
private val members = new ArrayBuffer[Member]
def join(name: String) = {
val m = new Member(name)
members += m
m
}
}
Supongamos que tenemos 2 Networks:
val chatter = new Network
val myFace = new Network
Cada instancia tiene una definición de clase por lo tanto la clase Member de chatter no es igual a la clase Member de myFace.
En nuestro ejemplo una instancia de Member puede ser agregado a diferentes redes:
val fred = chatter.join("Fred")
val wilma = chatter.join("Wilma")
fred.contacts += wilma // OK
val barney = myFace.join("Barney") // es de tipo myFace.Member
fred.contacts += barney // No porque son de diferente tipo
Ante este comportamiento hay 2 posibilidades:
1.Se puede mover Member a otra clase o a algún objeto. Por ejemplo:
object Network {
class Member(val name: String) {
val contacts = new ArrayBuffer[Member]
}
}
class Network {
private val members = new ArrayBuffer[Network.Member]
...
}
2. Se puede utilizar type projection, que permite utilizar una subclase en varias instancias. Network#Member esto significa Member es un subtipo y esta en la clase Network y no es una clase de la instancia.
class Network {
class Member(val name: String) {
val contacts = new ArrayBuffer[Network#Member]
}
...
}