La palabra clave con en Scala

Suraj P 21 junio 2023
La palabra clave con en Scala

Este artículo demostrará cómo usar la palabra clave with en Scala.

Utilice la palabra clave con en Scala

Esta palabra clave generalmente se usa cuando se trata de composiciones de clase con mixins. Los mixins son rasgos que se utilizan para componer una clase.

Esto es algo similar a una clase de Java que puede implementar una interfaz.

Veamos un ejemplo para entender mejor la palabra clave con:

abstract class vehicle {
  val message: String
}
class Car extends vehicle {
  val message = "I'm an instance of class vehicle"
}
trait sportsCar extends vehicle {
  def ourMessage = message.toUpperCase()
}
class temp extends Car with sportsCar

val obj = new temp
println(obj.message)  // I'm an instance of class vehicle
println(obj.ourMessage)  // I'M AN INSTANCE OF CLASS VEHICLE

En el código anterior, la clase temp tiene la superclase Car y la mezcla sportsCar. Una clase puede extender solo una superclase pero muchos mixins usando la palabra clave with; una superclase y mixins pueden tener el mismo supertipo.

Veamos otro ejemplo. Primero, creemos una clase abstracta con un tipo T y algunos métodos de iteración estándar.

abstract class ourIterator {
  type T
  def hasNext: Boolean
  def next(): T
}

Ahora, vamos a crear una clase concreta donde estén presentes todas las implementaciones de T de los miembros abstractos, que son hasNext y next.

class StringIterator(str: String) extends ourIterator {
  type T = Char
  private var i = 0
  def hasNext = i < str.length
  def next() =
  {
    val ch = str.charAt(i)
    i += 1
    ch
  }
}

Vamos a crear un rasgo que también amplíe la clase ourIterator.

trait anotherIterator extends ourIterator {
  def foreach(X: T => Unit): Unit = while (hasNext) X(next())
}

El rasgo anotherIterator implementa el método foreach() llamando a la función X: T => Unit continuamente en el siguiente elemento next() siempre que haya más elementos while(hasNext).

Dado que otroIterador es un rasgo, no necesita implementar ningún miembro abstracto de la clase nuestroIterador. Ahora podemos combinar las funcionalidades de anotherIterator y StringIterator en una sola clase, como se muestra a continuación:

class temp extends StringIterator("Tony") with anotherIterator
val obj = new temp
obj.foreach(println)

Código de trabajo completo:

abstract class ourIterator {
  type T
  def hasNext: Boolean
  def next(): T
}

class StringIterator(str: String) extends ourIterator {
  type T = Char
  private var i = 0
  def hasNext = i < str.length
  def next() =
  {
    val ch = str.charAt(i)
    i += 1
    ch
  }
}

trait anotherIterator extends ourIterator {
  def foreach(X: T => Unit): Unit = while (hasNext) X(next())
}

class temp extends StringIterator("Tony") with anotherIterator
val obj = new temp
obj.foreach(println)

Producción :

T
o
n
y

En el código anterior, la nueva clase temp tiene StringIterator como superclase y anotherIterator como mezcla. Solo con herencia única, no será posible lograr este nivel de flexibilidad.

Autor: Suraj P
Suraj P avatar Suraj P avatar

A technophile and a Big Data developer by passion. Loves developing advance C++ and Java applications in free time works as SME at Chegg where I help students with there doubts and assignments in the field of Computer Science.

LinkedIn GitHub