POO IV – Interfaces

Uno de los conceptos más difíciles de asimilar por los programadores iniciados en programación orientada a objetos es la de interfaces. Una interface es un tipo de estructura el cual nos dice la forma en la cuál trabajar pero sin decirnos cómo. A simple vista puede parecer complicado de entender, pero la verdad es que no.

Pensemos en la facultad de Ing. Civil de una Universidad. Ella tiene un sílabus que todo alumno debe seguir a lo largo de la carrera. El sílabus es la documentación de lo que se aprenderá en la carrera pero no provee los detalles del cómo el alumno lo aprenderá ni cómo el docente enseñará. Este sílabus viene a ser una interface.

Por otro lado, tenemos a los docentes de Ing. Civil. Cada uno de ellos tiene un método de enseñanza diferente pero todos ellos deben regirse al sílabus, sin importar cómo lo cumplan, solo tienen que cumplirlo. Los métodos de enseñanza de los docentes vienen a ser las implementaciones.

¿Qué pasaría si la facultad no tuviese sílabus (interface) de enseñanza? ¡Cada profesor enseñaría a su manera y no hubiese un estándar de enseñanza!. Esto por supuesto es lo que queremos evitar. Lo mismo pasa en programación, una interace define el qué se hará pero no el cómo se hará, ya que esto lo definen las implementaciones de dicha interfaz.

¿Qué es una implementación?

Una implementación o clase implementadora en Java una clase que implementa una interface y que por lo tanto define cómo se hará lo estipulado por la interface. Para entender en su totalidad el concepto de interface realicemos un ejemplo.

Una constructora encarga a sus 3 sucursales realizar una construcción de un edificio. Sin embargo, las sucursales deben seguir las pautas indicadas por la constructora.

public interface EdificeBuilder {
    
    void makeStructure();
    void makeOffices();
    void makeBathrooms();
    void makeElevators();
    void makeFacade();

}

Fíjate que los métodos de una interface son (públicos) abstractos (como el método talk de la clase Abstracta Animal del post anterior), esto es porque una interace es una abstracción, un qué y no un cómo, al igual que una clase abstracta. Por ende, los métodos de una interface son abstractos y las clases implementadoras definirán el cómo van a operar dichos métodos.

NOTA: A partir de Java 8 se puede definir un método en una interface por medio de default.

Como se puede observar, EdificeBuilder marca las pautas a tomar para la construcción de un edificio. Estos son, hacer la estructura, las oficinas, los baños, los ascensores y el acabado o fachada. Ahora, cada sucursal debe de aplicar esas pautas:

public class ModernEdifficeBuilder implements EdificeBuilder {

    @Override public void makeStructure()   {
        System.out.println("La estructura será moderna con un ligero grado de inclinación");
    }

    @Override public void makeFacade() {
        System.out.println("El acabado será muy moderno y abstracto");
    }

}

public class ClassicEdifficeBuilder implements EdificeBuilder {

    @Override public void makeStructure()   {
        System.out.println("La estructura será clásica, inclinación de 0 grados");
    }

    @Override public void makeFacade() {
        System.out.println("El acabado será clásico y plano");
    }

}

La tercera implementación es tu tarea ;). Vemos cómo tanto ModernEdifficeBuilder y ClassicEdifficeBuilder implementan la interface EdifficeBuild y cómo cada una de ellas define un procedimiento diferente.

Cuando una clase implementa una interface, automáticamente se convierte también en un tipo de esa clase, ¡lo que nos proveerá de un comportamiento polimórfico también (al igual que herencia)!. Esto lo podemos comprobar con:

ModernEdifficeBuilder instanceof EdifficeBuilder // true
ClassicEdifficeBuilder instanceof EdifficeBuilder // true

Veamos un ejemplo:

import java.util.Scanner;

public class Main {
    
    public static void main(String[] args) {
        EdifficeBuilder builder;
        Scanner keyboard = new Scanner(System.in);

        System.out.println("¿Qué tipo de edificio desea construir?\n");
        System.out.println("1. Moderno\n2. Clásico\n3. Salir");

        char selection = keyboard.next().chartAt(0);

        builder = selection == '1' ? new ModernEdifficeBuilder()
                                    : new ClassicEdifficeBuilder();
        
        builder.makeStructure();
        builder.makeFacade();

        keyboard.close();
    }

}

Dependiendo de la decisión del usuario, se creará una instancia de ModernEdifficeBuilder o de ClassicEdifficeBuilder, cualquiera de las dos podrá ser asignada al objeto EdifficeBuilder, dándole un comportamiento polimórfico.

Esto lo vemos con mucha frecuencia en Java, por ejemplo con colecciones (List, Map, Set) que veremos más adelante. Espero se haya entendido el tema de hoy y nos vemos 😉

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s