martes, 21 de abril de 2009

Herencia y Poliformismo, Ejemplo

La Herencia es el mecanismo por el que podemos definir una clase a partir de otra que ya exista, de forma que la nueva clase tendrá todas las variables y métodos de la clase a partir de la que se crea, más las variables y métodos nuevos que necesite. A la clase base a partir de la cual se crea la nueva clase se le llama superclase.


Has visto que las clases se definen de la siguiente manera
class MiClase {
//campo, constructor y declaraciones del metodo
}

La herencia se puede aplicar de las siguiente manera

class MiOtraClase extends MiClase { //Se crea una clase MiOtraClase de tipo MiClase
//campo, constructor y declaraciones del metodo
}

O tambien

Miclase MiOtraClase = new Miclase(); // se crea la subclase MiOtraClase de tipo MiClase


Esta es la declaracion de una clase. El cuerpo de la clase (area entre el signo de llaves) contiene todo el codigo que se le da para el ciclo de vida a los objetos creados de la clase: constructores para inicializar nuevos objetos, declaraciones, para los campos que proveen el estado de la clase y sus objetos, y metodos para implementar la conducta de la clase y sus objetos.

La parte más difícil de entender es el polimorfismo, es decir, la técnica que permite pasar un objeto de una clase derivada a funciones que conocen el objeto solamente por su clase base.

Por ejemplo, si se tiene la clase CCoche, se puede crear la subclase sucoche, que es una especialización de CCoche

Primero definimos las clases de la siguiente manera:

La superclase es CCoche
La subclase es SuCoche


El codigo de la superclase quedaria de la siguiente manera:


/*
* CCoche.java
*
* Created on April 22, 2009, 1:44 AM
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/

package Coche;

/**
*
* @author Marco Antonio Trejo Lemus
*/
public class CCoche {

/** La clase Ccoche tiene 5 campos */
private boolean encendido = false;
String marca;
String modelo;
String color;
int velocidad;

public void ArrancarMotor() {
{
if (encendido == true)
{
System.out.println("El motor ya esta encendido");
}
else
{
encendido=true;
System.out.println("El motor ha sido encendido");
}
}
}
public void CambiarVelocidad(int numvel)
{
if (encendido == false)
{
System.out.println("El motor esta apagado");
}
else
{
if (numvel == 0) {
//velocidad = 1;
System.out.println("El motor ha cambiado a velocidad " + numvel);
}
if (numvel == 1){
//velocidad = 2;
System.out.println("El motor ha cambiado a velocidad " + numvel);
}
if (numvel == 2){
//velocidad = 3;
System.out.println("El motor ha cambiado a velocidad " + numvel);
}
if (numvel == 3){
//velocidad = 4;
System.out.println("El motor ha cambiado a velocidad " + numvel);
}
if (numvel == 4){
//velocidad = 5;
System.out.println("El motor ha cambiado a velocidad " + numvel);
}
}
}

public void ApagarMotor()
{
if (encendido == false)
{
System.out.println("El motoror ya esta apagado");
}
else
{
encendido=false;
System.out.println("El motor ha sido apagado");
}
}

public void Acelerar()
{
if (encendido == false)
{
System.out.println("El motoror esta apagado... encender");
}
else
{
System.out.println("Acelerando...");
velocidad +=1;
}
}
public void Frenar()
{
if (encendido == false)
{
System.out.println("El motor esta apagado");
}
else
{
System.out.println("Frenando el motor...");
velocidad -=1;
}
}
} //fin de la clase




El codigo de la subclase es el siguiente:



/*
* SuCoche.java
*
* Created on April 22, 2009, 1:44 AM
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/

package Coche;

/**
*
* @author Marco Antonio Trejo Lemus
*/

public class SuCoche {

/** Crea una nueva instancia de SuCoche */

public SuCoche() {
}

public static void main(String[] args)
{
CCoche sucoche = new CCoche(); // se crea la subclase sucoche de tipo CCoche

sucoche.color="Rojo"; // se utilizan los metodos heredados de CCoche
sucoche.marca="Mustang";
sucoche.modelo="2007";
sucoche.velocidad =0;
sucoche.ArrancarMotor();
sucoche.CambiarVelocidad(2);
sucoche.Acelerar();
sucoche.Acelerar();
sucoche.CambiarVelocidad(3);
sucoche.Acelerar();
sucoche.Acelerar();
sucoche.CambiarVelocidad(4);
sucoche.Frenar();
sucoche.Frenar();
sucoche.CambiarVelocidad(3);
sucoche.Frenar();
sucoche.Frenar();
sucoche.CambiarVelocidad(2);
sucoche.Frenar();
sucoche.CambiarVelocidad(1);
sucoche.ApagarMotor();
}
} //fin de la clase



Para este ejemplo definimos como main a la clase SuCoche
el resultado seria el siguiente:

El motor ha sido encendido
El motor ha cambiado a velocidad 2
Acelerando...
Acelerando...
El motor ha cambiado a velocidad 3
Acelerando...
Acelerando...
El motor ha cambiado a velocidad 4
Frenando el motor...
Frenando el motor...
El motor ha cambiado a velocidad 3
Frenando el motor...
Frenando el motor...
El motor ha cambiado a velocidad 2
Frenando el motor...
El motor ha cambiado a velocidad 1
El motor ha sido apagado

En Java no se puede hacer herencia múltiple. Por ejemplo, de la clase aparato con motor y de la clase animal no se puede derivar nada, sería como obtener el objeto toro mecánico a partir de una máquina motorizada (aparato con motor) y un toro (aminal). En realidad, lo que se pretende es copiar los métodos, es decir, pasar la funcionalidad del toro de verdad al toro mecánico, con lo cual no sería necesaria la herencia múltiple sino simplemente la compartición de funcionalidad que se encuentra implementada en Java a través de interfaces.


Siguiente tema... Interfaces


Saludos

No hay comentarios:

Publicar un comentario