Saltar a contenido

Sesión 05: Extendiendo la abstracción

Restricciones a la clases

Para precondiciones (a la hora de instanciar)

class pepito(x:Int,y:Int){
    require(x>0,"x debe ser mayor que 0")
}

En caso de que no se cumpla, se lanza una excepción

Para poscondiciones (a la hora ejecutar)

assert(...)

La condición que está en assert debe ser TRUE de lo contrario el programa lanza una excepción, utilizamos para las pruebas de software


Herencia

Una clase puede tomar atributos y metodos de otra clase a través de la herencia

class a {..}
class b extends a

La clase b toma los campos y metodos de la clase a


Clases abstractas

La clases abtractas permiten definir los atributos y métodos de las clases hijas, pero estas DEBEN IMPLEMENTARLOS

abstract class pepito {
    def a()
    def b()
}

class luisito(x:Int) extends pepito {
    def a() ...
    def b() ...
}

Una clase abstracta permite definir que métodos y que campos van a tener las clases hijas, sin embargo estas deben implementarlos, una clase abstracta NO SE PUEDE INSTANCIAR DIRECTAMENTE

abstract class a{}
class b extends a
class c extends a

val objA = new b()
val objB = new c()

objA y objB son de tipo a, pero su implementación es diferente, esto es POLIFORMISMO, un objeto tipo a tiene dos comportamiento, uno dado por b y otro dado por c


Traits

Son similares a las interfaces de java, no permiten heredar a otras clases, no se puede instanciar

trait Nombre {
    def a
    def b
    def c = a+b
    def metodo(a:Int) ...   
}

Una clase sólo puede heredar de UNA y SOLA UNA; pero puede extender de uno o más traits

class A extends X with T1 with T2 {
}

Despacho dinámico de métodos

Un método de un objeto dado puede tener diferente comportamiento DEPENDIENDO DE LA IMPLEMENTACION que se esté usando..

abstract class Animal {
    def sonido() = "grrr"
}
class Gato extends Animal {
    override
    def sonido() = "miau"
}

class Leon extends Animal 
{
}

val a1:Animal = new Gato()
print(a1.sonido()) //miau
val a2:Animal = new Leon()
print(a2.sonido()) // grrr