El blog de Martini

POO – Clases Abstractas, Interfaces y Herencia Múltiple.

Septiembre 17, 2008 · 6 comentarios

En la entrada anterior vimos lo algunos conceptos básico de la POO, ahora veremos cómo se pueden generalizar las clases, forzandolas a seguir un patrón de comportamiento( qué hacer, no cómo ).

Finalmente se verá cómo se utiliza la Herencia Múltiple.

Clases Abstractas

Este Tipo de Clases nos permiten crear “método generales”, que recrean un comportamiento común, pero sin especificar cómo lo hacen. A nivel de  código tienen por particularidad que algunos de sus métodos no tienen “cuerpo de declaración”, ¿qué quiere decir esto? no tienen las llaves { } ni código dentro de ellos y deben estar precedidos por la palabra clave abstract. Si una clases contiene uno o más métodos abstractos está clase debe ser abstracta. Estas clases como son generalidades no pueden ser instanciadas por ningún objeto (se dice que su nivel de abstracción es demasiado alto), entonces su único fin es ser heredado/extendido por otras clases.

Ejemplo

public abstract class Figura {

	// Atributos:
	public int numeroLados;
	public int area;
	public int volumen;

	// Métodos:
	abstract public void calcularArea();
	abstract public void calcularVolumen();
}

En este poco original ejemplo se puede apreciar que toda figura tiene un método para calcular su Área y Volumen.

Ahora creemos la clase Esfera, que “Es una” Figura.

public class Esfera extends Figura{

	public float radio;
	public static float pi = (float)(3.1415);

	public Esfera( int radio ){
		this.radio = radio;
		this.numeroLados = 0;
	}

	// 4*pi*r²
	public void calcularArea(){

		this.area =  (4)*pi*radio*radio;
	}

	// (4/3)*pi*radio³
	public void calcularVolumen(){

		this.volumen =  (4/3)*pi*radio*radio*radio;
	}

}

ATENCIÓN:
- Las clases que hereden de la clase Abstracta deben implementar todos los métodos abstractos.
- Se debe tener presente que las clases abstractas pueden heredar de otras clases.
- La firma o parámetros de los métodos así como el tipo de dato deben respetarse, de lo contrario se está hablando de otro método totalmente diferente.

Si una clase abstracta está compuesta sólo por métodos abstractos y constantes entonces podemos hablar de una interface.

Interfaces

Las interfaces, tal como las clases abstractas. no se pueden instanciar. Sus métodos deben ser re-escritos por la clase que implemente.

Ejemplo fome:

public interface MatematicaVectorial {

 public static double pi    = 3.1415;
 public static double e     = 2.71828;

 public double[] sumar(int[][] vectores);
 public double[] restar(int[][] vectores);
 public double productoPunto(int[][] vectores);

}

La clase VectorR3, que es un vector de R³ implementa MatematicaVectorial


public class VectorR3 implements MatematicaVectorial
{
    public double valorX;
    public double valorY;
    public double valorZ;

    public double[] sumar(int[][] vectores){
        //Implementacion
    }

    public double[] restar(int[][] vectores){
        //Implementacion
    }  

    public double productoPunto(int[][] vectores)
    {
        //Implementacion
    }
}

¿y para qué hay interfaces, si hacen “casi” lo mismo que las clases abstractas? veamos el porqué

Herencia Múltiple

Java, asi como la mayoría de los lenguajes orientados a objetos, no permite la herencia múltiple (tipo grafo), pero bueno si la herencia jerarquica o de tipo árbol no es suficiente para modelar nuestro problema podemos valernos de la herencia y las interfaces.

Una sub-clase puede heredar de sólo UNA Super-Clase pero puede implementar varias interfaces

(no se me ocurre ningún ejemplo más didáctico que los que aparecen en google o libros, sí esos del tipo punto, figura, polígono, cuadrado xD )

Eso por ahora… espero haya sido claro.

Saludos

Categorías: Programacion Orientada a Objetos
Etiquetado: , , , ,

6 respuestas hasta el momento ↓

Dejar un comentario