Herencia e interfaces en Ceylon


Hace tiempo que no escribo nada y que mejor volviéndolo hacer sobre Ceylon.

Interfaces

Las interfaces son una colección de métodos y propiedades que permiten a una clase definir su implementación. Si en esa colección defino un método llamado  comer() la clase se encargará de implementarlo cuando corresponda a la lógica del problema. Por ejemplo, una clase llamada Animal y/o Persona pueden emplear ese método, sin embargo, una clase llamada Maquina y/o Turbina podría usarse un método más adecuado como encender(); o  apagar(); .

Herencia

La Herencia, dentro de la programación orientada a objetos, nos permite evitar duplicar código. Métodos y propiedades comunes pueden compartirse entre clases. Si defino una clase llamada Persona y sus propiedades son: nombre, edad, estatura, peso y otra llamada Cliente puedo hacer que sea su hija y evitar volver a escribir esas propiedades. Además de métodos como mostrarDatos(); pueden ser compartidos.

Ejemplo. Definiremos lo siguiente:

  • Una interface: Habilidades
  • Una clase base o padre llamada: Animal
  • Dos clases hijas: Ave y Felino

Esta interface nos provee un método "común" llamado comer();

interface Habilidades{
    shared formal void comer();
}

Esta es la clase padre. Con dos propiedades: nombre y número de patas.

class Animal(String nombre ,Integer patas){
    shared default String description =>"(``nombre``, ``patas``)";
}

Esta es una clase hija llamada Ave.

class Ave(String nombre ,Integer patas, String color) extends Animal(nombre, patas) satisfies Habilidades{
      description = "Ave: ``nombre`` ,color ``color``, no.patas: ``patas`` ";

      shared actual void comer(){
        print("El Ave come alpiste");
      }
}

La clase Felino.

class Felino(String nombre , Integer patas,  String color) extends Animal(nombre, patas) satisfies Habilidades{
      description = "Felino: ``nombre`` ,color: ``color``, no. patas: ``patas`` ";

      shared  actual void comer(){
        print("El Felino come carne");
      }
}

El método principal del programa.

shared void run(){
    value bird = Ave("Birdie",2,"naranja");
    value felix=Felino("Felix",4,"negro");
    print(bird.description);
    print(felix.description);

}

Compilamos y ejecutamos desde terminal.

compilar: ceylon compile source/holaCeylon/run.ceylon
ejecutar: ceylon run holaCeylon/1.0.0

La salida:

Ave: Birdie ,color naranja, no.patas: 2 
Felino: Felix ,color: negro, no. patas: 4 

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

Interfaces

Una característica importante de las interfaces de Ceylon es que permiten métodos con implementaciones concretas:

shared interface Ejemplo {
  shared formal void metodoNoImplementado();

  shared void metodImplementado() {
    print("Metodo implementado");
    metodoNoImplementado();
  }
}

Y sólo una observación al margen con esa propiedad description: si hubieras refinado string en vez de implementar description, te puedes ahorrar invocar esa propiedad a la hora de imprimir los objetos (string en Ceylon es como el método toString() en Java).