Sunteți pe pagina 1din 11

Clases Abstractas

Este Tipo de Clases nos permiten crear mtodo generales, que recrean un comportamiento comn, pero sin especificar cmo lo hacen. A nivel de cdigo tienen por particularidad que algunos de sus mtodos no tienen cuerpo de declaracin, qu quiere decir esto? no tienen las llaves { } ni cdigo dentro de ellos y deben estar precedidos por la palabra clave abstract. Si una clase contiene uno o ms mtodos abstractos est clasedebe ser abstracta. Estas clases como son generalidades no pueden ser instanciadas por ningn objeto (se dice que su nivel de abstraccin es demasiado alto), entonces su nico fin es ser heredado/extendido por otras clases.

1 2 3 4 5 6 7 8 9 10

public abstract class Figura {

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

// Mtodos: abstract public void calcularArea(); abstract public void calcularVolumen(); }

11

Ejemplo

En este poco original ejemplo se puede apreciar que toda figura tiene un mtodo para calcular su rea y Volumen. Ahora creemos la clase Esfera, que Es una Figura. 1 2 3 4 5 6 7
this.numeroLados = 0; public Esfera( int radio ){ this.radio = radio; public float radio; public static float pi = (float)(3.1415); public class Esfera extends Figura{

8
}

9 10
// 4*pi*r

11 12 13 14 15 16 17

public void calcularArea(){

this.area = }

(4)*pi*radio*radio;

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

18 19 20 21 22 23 ATENCIN: - Las clases que hereden de la clase Abstracta deben implementar todos los mtodos abstractos. - Se debe tener presente que las clases abstractas s pueden heredar de otras clases. - La firma o parmetros de los mtodos as como el tipo de dato deben respetarse, de lo contrario se est hablando de otro mtodo totalmente diferente. Si una clase abstracta est compuesta slo por mtodos abstractos y constantes entonces podemos hablar de una interface.
} } this.volumen = (4/3)*pi*radio*radio*radio;

Interfaces
Las interfaces, tal como las clases abstractas. no se pueden instanciar. Sus mtodos deben ser re-escritos por la clase que implemente. Ejemplo fome: 1 2 3 4 5
public static double pi public static double e = 3.1415; = 2.71828; public interface MatematicaVectorial {

6 7 8 9 10
}

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 1 2 3 4


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

5 6
public double[] sumar(int[][] vectores){

7
//Implementacion

8
}

9 10 11 12 13 14
public double productoPunto(int[][] vectores) } public double[] restar(int[][] vectores){ //Implementacion

15 16 17 18 19
}

{ //Implementacion }

Ejemplo de Polimorfismo En Java


Para este ejemplo vamos a trabajar usando una Interface, una clase Abstracta y 2 clases Concretas como vemos en el siguiente diagrama:

Podemos ver que se tiene un rbol de herencia definido, donde la clase Abstracta Animalimplementa la interface IAnimal y al mismo tiempo es clase Padre de Gato y Perro, los cuales implementaran no solo los mtodos abstractos de Animal sino tambin el mtodocomunicarse() de la interface IAnimal.......en entradas anteriores vimos que una de las reglas al trabajar con clases abstractas o interfaces es que todas las clases concretas que desciendan de ellas, estn obligadas a implementar sus mtodos......... en este caso veremos como la clase Animal al ser abstracta no esta obligada a hacerlo, pero sus hijas si....

Veamos como se codifica el diagrama anterior en Java: Interface IAnimal.

1 public interface IAnimal { 2 3 int valor=5; 4 5 /** 6 * Mtodo Comunicarse, sera implementado por las clases concretas * que hereden de la clase Animal 7 */ 8 public void comunicarse(); 9 10 } 11 La Interface IAnimal posee el mtodo comunicarse() el cual es completamente abstracto, evidenciamos que no es necesario indicarlo mediante la palabra abstract...........De la misma forma tenemos el atributo valor el cual (al ser declarado en la interface) se comporta como una Constante, as que nunca va a cambiar (en la entrada sobre Interfaces indicamos el porqu de estas propiedades)....
Clase Abstracta Animal. public abstract class Animal implements IAnimal { 1 2 private String nombre; 3 4 /** 5 * Constructor de la clase Animal 6 * @param nombre */ 7 public Animal (String nombre){ 8 this.nombre=nombre; 9 System.out.println("Constructor Animal, " + 10 "nombre del animal : "+this.nombre); 11 } 12 /** 13 * Retorna el valor de nombre 14 * @return 15 */ 16 public String getNombre(){ return nombre; 17 } 18 19 20 /** 21 * Metodo Abstracto tipoAnimal, la implementacin depende 22 * de las clases concretas que extiendan la clase Animal 23 */

24 25 26 27 28 29 30

public abstract void tipoAnimal(); }

Como vemos tenemos la clase Abstracta que implementa la Interface IAnimal pero como mencionamos al principio, esta clase no esta obligada a implementar el mtodocomunicarse() ya que tambin es clase abstracta. Tenemos el mtodo tipoAnimal() el cual si debe ser declarado como abstracto, evidenciamos tambin el atributo nombre el cual lo declaramos como private y solo accederemos a el en nuestro rbol de herencia, con el aplicamos un poquito el concepto deEncapsulacin (pero no de la forma ideal, podemos ver una pequea definicin en la entrada sobre conceptos Bsicos). Clase Gato. 1 2 public class Gato extends Animal{ 3 4 /** * Constructor explicito clase Gato 5 * @param nombre 6 */ 7 public Gato(String nombre) { 8 super(nombre);//envia el parametro a el constructor de la clase padre 9 System.out.println("Constructor Gato, nombre : "+nombre); } 10 11 public void tipoAnimal() { 12 System.out.println("Tipo Animal : Es un Gato"); 13 } 14 15 public void comunicarse(){ System.out.println("Metodo comunicarse : El gato maulla... Miau Miau"); 16 } 17 } 18 19 Clase Perro.

public class Perro extends Animal{

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

/** * @param nombre */ public Perro(String nombre) { super(nombre); System.out.println("Constructor perro, nombre : "+nombre); } public void tipoAnimal() { System.out.println("Tipo Animal : Es un Perro"); } public void comunicarse(){ System.out.println("Metodo comunicarse : El perro Ladra... Guau Guau"); } }

Como vemos las Clases Gato y Perro heredan de la clase abstracta Animal, por ende implementan el mtodo tipoAnimal(), y como Animal implementa la interface IAnimal, entonces tanto Gato como Perro al ser clases concretas estn obligadas a implementar el mtodo comunicarse().... En las clases tambin podemos ver que se utiliza la propiedad nombre que es enviada al constructor de Animal mediante el llamado a super(nombre). Hasta aqu ya tenemos las clases del diagrama, ahora veamos como relacionarlas mediante una clase principal. Clase Test. public class Test { 1 public static void main (String[] arg){ 2 3 /**Creamos anim, un objeto Perro de tipo Animal*/ 4 Animal anim= new Perro("goliath") ; 5 anim.tipoAnimal(); anim.comunicarse(); 6 System.out.println(); 7 8 /**Creamos perro, un objeto Perro de tipo Perro*/ 9 Perro perro=new Perro("hercules"); 10 perro.tipoAnimal(); 11 System.out.println(); 12 /**Creamos animalPolimorfico, un objeto perro de tipo Animal 13

* asignamos una referencia ya existente*/ 14 Animal animalPolimorfico=perro; 15 animalPolimorfico.tipoAnimal(); 16 System.out.println(); 17 18 /**reasignamos la referencia del objeto anim a el objeto perro * esto es valido ya que ambos son de tipo Perro*/ 19 perro=(Perro) anim; 20 perro.tipoAnimal(); 21 System.out.println(); 22 23 /**Creamos gat, un objeto Gato de tipo Animal*/ 24 Animal gat=new Gato("pichi"); gat.tipoAnimal(); 25 gat.comunicarse(); 26 System.out.println(); 27 28 /**Creamos cat, un objeto Gato de tipo IAnimal 29 * Para esto aplicamos polimorfismo usando la Interface*/ 30 IAnimal cat = new Gato("pitufa"); cat.comunicarse(); 31 32 System.out.println("\nConstante en la interfaz Animal : "+IAnimal.valor); 33 } 34 } 35 36 37 38 39 40 Esta clase permite la creacin de Objetos Polimorficos donde vemos que podemos usar lassuperClases para crear objetos de sus subClases, de esa forma podemos decir que perroes un Animal o Gato es un Animal .... Al ejecutar obtenemos.

En este ejemplo creamos diferentes objetos uno a uno para verificar la aplicacin del polimorfismo, pero esto tambin puede evidenciarse de otras maneras, por ejemplo podemos crear un arreglo de tipo Animal y en el almacenar objetos de su rbol de herencia.... veamos.. Agreguemos a la clase Test el siguiente cdigo... 1 Animal animales[]= { new Perro("simon"),new Perro("paco"),new Gato("mimi")}; 2 for(Animal a : animales){ a.tipoAnimal(); 3 } 4 System.out.println(); 5 Como mencion hace un momento, tenemos un arreglo animales de tipo Animal donde en cada posicin almacenamos diferentes objetos subClases de Animal, as que cuando recorremos el arreglo podemos acceder a las propiedades del objeto que corresponda, as como las de su superClase...

Si de pronto quisieramos agregar al arreglo animales un objeto de tipo Planta, esto nos arrojara error, ya que planta no debera hacer parte de la Jerarqua definida para el arreglo con el que estamos trabajando, en otras palabras porque planta no es un Animal....

Conclusiones.... En los ejemplos pudimos aplicar las reglas de Polimorfismo vistas en la entrada anterioradems tambin evidenciamos la aplicacin de otros conceptos combinando algunos como la Herencia, Clases Concretas, Clases Abstractas, Interfaces.

Podemos resaltar el mtodo comunicarse() que heredan las clases Perro y Gato, donde al ser un mtodo abstracto nos permite dar la implementacin que queramos dependiendo de quien lo use, entonces podemos ver que tanto perro como gato se comunican pero de forma distinta y esa diferencia se ve en nuestra implementacin... En general vimos la importancia de trabajar con un paradigma Orientado a Objetos, pues nos da facilidades tanto a nivel de optimizacin como a nivel de estructura y lgica de la aplicacin, as como brindar claridad en los principales conceptos en torno a la POO...

S-ar putea să vă placă și