sábado, 8 de abril de 2017

Un resumen de Scala for the Impatient, parte 15



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 
}

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] 
... 
}