Capitulo 7 – Herencia de Clases (Parte II)

Buenas tardes, hoy os traigo la Parte II del Capitulo 7, en el cual abarcaré solo las Interface, , donde proseguiremos con la Encapsulación, y una última parte con ejemplos avanzados para explicarnos todo este montón de teoría. Como dije anteriormente, es un Capítulo muy largo por lo cual constará de bastantes partes, pero es mejor ir paso a paso, despacio y con buena letra.

Interfaces

Son usados en el lenguaje Java para definir un set definido de funcionalidades de las clas clases que las implementan. Al contrario que heredar una clase base, una clase es libre de implementar tantas interfaces como se necesiten. Una interface puede ser pensada como una clase abstracta con todos los métodos abstractos.
Cuando una clase implementa una interface, esto requiere que se implementen todos los métodos definidos en la interface. Son usadas para crear una interface pública estándar para items similares. Esto habilita que el código sea mas modular. Se usa la sentencia interface para crear una interface en el siguiente ejemplo:

public interface Phone {
    public void dialNumber(int number);
    public boolean isCallInProgress();
}

El anterior ejemplo es una interface para un teléfono muy básica. El siguiente ejemplo demuestra esta interface siendo implementada en una clase CellPhone y una clase LandLinePhone. La sentencia implements es usada para implementar la interface:

public class LandLinePhone implements Phone{
    private boolean callInProgress;
    public void dialNumber(int number) {
        //Dial number via wired network
    }

    public boolean isCallInProgress() {
        return callInProgress;
    }
}
public class CellPhone implements Phone{
    private boolean callInProgress;
    public void dialNumber(int number) {
        //Dial number via cell network
    }

    public boolean isCallInProgress() {
        return callInProgress;
    }
}

Cuando una interface es implementada, todos estos métodos deben ser implementados en esta clase. Es posible implementar múltiples interfaces. Cuando mas de una interface está siendo usada, todos estos métodos definidos en cada uno debe ser implementados. Cualquier método sin implementar causará errores al compilar.
Lo siguiente es un ejemplo de una clase que implementa 2 interfaces:

public class VideoPhone implements Phone, VideoPlayer{
  ...
}

El gran avance de usar interfaces es que cualquier clase puede usar la misma interface y tendrán los mismos métodos públicos, como veremos en la figura siguiente. Esto significa que la clase CellPhone mostrada anteriormente podría ser usada en vez de la clase LandLinePhone.
Cambiar entre estas clases no requerirían otro cambio en el código mas que el tipo declarado. Esto nos hace una idea de lo que es el polimorfismo, que veremos en detalle en el capitulo 8.

Advanced Concepts of Inheritance

En las secciones pasadas vimos casos básicos sobre la herencia. SIn embargo es posible y común tener mas niveles de herencia. De hecho cada clase en el lenguaje Java hereda de la clase base Object. Esto incluye las clases creadas por un desarrollador. El uso de la clase base Object es implícita y no es necesario extenderla explícitamente con la sentencia extends. Esto significa que en los ejemplos anteriores donde una clase heredaba de otra, había realmente 2 niveles de herencia. Volviendo a los ejemplos de los animales, la clase Dog2 heredaba de la clase Animal, y la clase Animal heredaba de la clase Object. Esto implica que la clase Dog2 ganaba toda la funcionalidad de ambas clases. Si una clase sustituye al método de otra, el nuevo método baja en la cadena de la herencia. La cadena de la herencia puede continuarse tanto como sea aplicable a la aplicación, es decir, una Clase A puede ser extendida a una Clase B que peude extenderse a una Clase C que puede extenderse a una Clase D. Las clases pueden ser mezcla entre abstractas o concretas.
Las clases tambien permiten implementar tantas interfaces como sea posible. las intetrfaces pueden tambien extenderse a otras interfaces. Cuando una interface es extendida a otra, esto gana todos los métodos definidos en la interface extendida. Al contrario de las clases, una interface puede ser extendida por una o varias interfaces. Esto se logra con la sentencia extends seguido de una lista de interfaces delimitadas por comas.
El siguiente diagrama representa un arbol posible de herencia. En la parte de abajo del arbol vemos una clase concreta SportsCar. Esta clase es extendida de la clase abstracta Car. La clase Car es extendida de la clase PassengerVehicle, que es extendida de la clase Object. La clase PassengerVehicle tambien implementa la interface Drivable.
En este ejemplo la clase SportsCar tiene acceso a todos los métodos visibles e instance variables de PassengerVehicle y de la clase Car. la clase SportsCar debe tambien implementar cualquier método que no fuera implementado, incluyendo lo que son requeridos por la interface Drivable.

Aquí terminamos con esta Parte del capitulo 7, en el siguiente profundizaremos sobre la Encapsulación en Java, para que sirve y cual es su objetivo en el código.

Cualquier aporte o corrección es bienvenida.

Saludos!!!