top of page

5 Clases

 


Como hemos visto, Scala es un lenguaje orientado a objetos, y como tal tiene el concepto de clase.2 Las clases en Scala se declaran usando una sintaxis próxima a la de Java. Una diferencia importante es que las clases en Scala pueden tener parámetros. Lo ilustramos con la siguiente definición de números complejos:


class Complex(real: double, imaginary: double) {
    def re() = real
    def im() = imaginary
}

 


Esta clase recibe dos argumentos, que son la parte real y la parte imaginaria del número complejo. Estos argumentos hay que pasarlos cuando se crea una instancia de la clase Complex, de la siguiente manera: new Complex(1.5, 2.3). La clase contiene dos métodos, llamados re e im, que permiten el acceso esas dos partes. Hay que hacer notar que el tipo de respuesta de esos dosmétodos no está dado explicitamente. El compilador lo inferirá automáticamente mirando al lado derecho de los dos métodos para deducir que ambos devuelven un valor de tipo double. Por completitud, hay que decir que algunos lenguajes orientados a objetos no tienen el concepto de clase, pero Scala no es uno de ellos.


El compilador no es capaz de deducir tipos siempre como hace aquí, y desafortunadamente no hay una regla simple para saber cuando lo será y cuando no. En la práctica generalmente esto no es un problema puesto que el compilador se queja cuando no es capaz de inferir un tipo que no se explicita. Como regla simple, los programadores principiantes de Scala deberian omitir las declaraciones de tipos que parezcan fáciles de deducir a partir del contexto, y ver si el compilador está de acuerdo. Después de un tiempo, el programador habrá desarrollado un buen criterio sobre cuando omitir los tipos y cuando declararlos explicitamente.

 

 

5.1 Métodos sin argumentos 

 

Un pequeño problema con los métodos re e im es que, para poder llamarlos, uno

ha de poner un par de paréntesis después del nombre, como muestra el siguiente
ejemplo:


object NumerosComplejos {
    def main(args: Array[String]) {
        val c = new Complex(1.2, 3.4)
        println("parte imaginaria: " + c.im())
    }
}

 


Estaría bien poder acceder a las partes real e imaginaria como si fueran variables, sin tener que poner los paréntesis. Esto se puede hacer sin problemas en Scala, simplemente definiendolos comométodos sin argumentos. Tales métodos difieren de los métodos con cero argumentos en que no llevan paréntesis tras su nombre, ni en su definición ni en su uso. Nuestra clase Complex se puede reescribir así:


class Complex(real: double, imaginary: double) {
    def re = real
    def im = imaginary
}

 

 

5.2 Herencia y sobreescritura

 

Todas las clases en Scala heredan de una super-clase. Cuando no se especifica superclase, como en el ejemplo de la clase Complex de la sección previa, implicitamente se usa scala.Object.


En Scala es posible sobreescribir métodos heredados de una superclase. Pero es obligatorio especificar explícitamente que un método sobreescribe a otro usando el modificador override, para evitar sobreescrituras accidentales. Como ejemplo podemos aumentar nuestra clase Complex con la redefinición del método toString heredado de Object.


class Complex(real: double, imaginary: double) {
    def re = real
    def im = imaginary
    override def toString() =
        "" + re + (if (im < 0) "" else "+") + im + "i"
}

bottom of page