jueves, 3 de junio de 2010

Encapsulacion, Herencia y Polimorfismo



Encapsulación, Herencia y Polimorfismo: Conceptos Elementales e Importantes en el paradigma de la Programación Orientada a Objetos.


La Encapsulación es el ocultamiento de las propiedades o estado de los datos miembro de un objeto, de tal forma que la única vía para acceder a estos se a través de métodos o comportamientos públicos, estos últimos constituyen la interfaz entre el objeto y el usuario.






La encapsulación se utiliza para proteger los datos de posibles modificaciones de entidades que no tienen permiso para hacerlo, o de modificaciones controladas y/o no esperadas. También para asegurar el buen funcionamiento de demás código que utilice el objeto si la implementación de este llegue a cambiar.

Un ejemplo de encapsulación es el funcionamiento de un maquina que despacha refrescos o chocolates, en la que esta recibe una moneda hace algún proceso de verificación y otras cosas y devuelve un refresco. Nosotros como usuarios de la maquina (objeto) no necesitamos saber como hace este proceso, sino por donde se introducen las monedas (método introducirMonedas()) y por donde retiramos lo que queremos de la maquina (método getElemento()). Estos últimos métodos o comportamientos son la interface entre el objeto y nosotros los usuarios.

En lo que nos compete, en Java conseguimos encapsulación cuando en una clase tenemos las variables de instancia protegidas del exterior, a través de los modificadores de acceso (prívate, protected, default) y cuando creamos métodos públicos para acceder a estas variables.


Ej.:

// Clase Carro
public class Carro {

  private String color;
  private String marca;
  private double velocidad;
 
  public Carro() {
    super("Carro");
  }

// getters

  public String getColor() {
    return color;
  }

  public String getMarca() {
    return marca;
  }

  public double getVelocidad() {
    return velocidad;
  }

// setters

  public void setColor(String color) {
    this.color = color;
  }

  public void setMarca(String marca) {
    this.marca = marca;
  }
 
  public void setVelocidad(double velocidad) {
    this.velocidad = velocidad;
  }

  // gral methods

  public void acelerar() {
    System.out.println("... Acelerando ...");
  }
 
  public void mover() {
    System.out.println("... Me muevo como un carro; en la tierra ...");
  }

}


La Herencia es una expresión del polimorfismo que promueve la reutilización de código, en el que una subclase hereda comportamientos y características de otra clase llamada superclase.




En el concepto de herencia de distinguen las relaciones is-a y has-a entre objetos. En la primera un objeto de una subclase puede ser tratado o como el mismo o como un objeto de su superclase/interface (polimorfismo), la segunda se manifiesta cuando dentro de una clase tenemos como variables de instancias a referencias a otros objetos.

En java una subclase extiende o hereda de otra clase a través del keyword extends, e implementa comportamientos de una interface utilizando el keyword implements

Ej.:

// Clase Vehiculo
public class Vehiculo {
  private String tipo;
 
  public Vehiculo() {
  }

  public Vehiculo(String tipo) {
    this.tipo = tipo;
  }

  public String getTipo() {
    return tipo;
  }

  public void mover() {
    System.out.println("... Me muevo como un vehiculo en general ...");
  }

}

// Interface DeCarreras
public interface DeCarreras {
  public void setNitrogeno();
}


// Nueva Clase Carro
public class Carro extends Vehiculo implements DeCarreras {
  private String color;
  private String marca;
  private double velocidad;

  public Carro() {
    super("Carro");
  }

// getters

  public String getColor() {
    return color;
  }

  public String getMarca() {
    return marca;
  }
 
  public double getVelocidad() {
    return velocidad;
  }


// setters

  public void setColor(String color) {
    this.color = color;
  }

  public void setMarca(String marca) {
    this.marca = marca;
  }

  public void setVelocidad(double velocidad) {
    this.velocidad = velocidad;
  }


// gral methods

  public void acelerar() {
    System.out.println("... Acelerando ...");
  }

  public void setNitrogeno() {
    System.out.println("\t... Nitrogeno suelto ...");
  }

  public void mover() {
    System.out.println("... Me muevo como un carro; en la tierra ...");
  }

}

Por ejemplo la clase Carro extiende o hereda directamente de la clase vehiculo e implementa la interface DeCarreras. La clase Carro hereda los métodos mover y getTipo de su superclase vehiculo y sobre escribe el método setNitrogeno de la interface.

El Polimorfismo es un concepto de programación orientado a objetos que nos permite escribir programas que utilizan objetos que comparten la misma superclase en la jerarquía de clases. Es decir en un momento determinado dependiendo de la lógica de nuestro código, podemos tratar un objeto de diferentes formas (polimorfismo) como el mismo o como un objeto de la clase que hereda o interface que implementa, cual sea el caso. El polimorfismo está estrechamente relacionado con la herencia y la sobre escritura.

Ej.: Supongamos que tenemos dos clases más a parte de la clase Carro que extienden de la clase Vehículo de más arriba

// Clase Tren
public class Tren extends Vehiculo{
  public Tren() {
    super("Tren");
  }

  public void mover() {
    System.out.println("... Me muevo como un tren; en rieles ...");
  }

  public void hacerChuChu() {
    System.out.println("... Chu-Chu ...");
  }

}


// Clase Avion
public class Avion extends Vehiculo {
  public Avion() {
    super("Avion");
  }

  public void mover() {
    System.out.println("... Me muevo como un avion; en el aire ...");
  }

  public void aterrizar() {
    System.out.println("... Aterrizando ...");
  }

}


// Clase TestVehiculo
public class TestVehiculo {

  public static void main(String[] args) {
    System.out.println("\n.... Probando Conceptos de Encapsulacion, Herencia y Polimorfismo ....\n");
    Vehiculo[] vs = new Vehiculo[] {new Carro(), new Avion(), new Tren()};
    new TestVehiculo().testMedioTransporte(vs);
  }

  public void testMedioTransporte(Vehiculo[] vhcls) {
    for (Vehiculo v : vhcls) {
      System.out.print(v.getTipo() + ": ");
      v.mover();
      if (v instanceof Carro) {
        ((Carro)v).setNitrogeno();
      }
    }
  }

}


Cada subclase de este ejemplo que extiende de la clase Vehiculo hereda y sobre escribe el método mover, ya que cada uno de estos se puede mover de diferentes formas (en rieles, en la tierra o en el aire).

En la aplicación java de ejemplo (TestVehiculo), se simula el movimiento de cada una de estas clases, la aplicación le envía el mismo mensaje a cada objeto, el de moverse y estos dependiendo de la implementación reaccionan diferente o de varias formas (polimorfismo). Confiando en cada objeto la forma en que pueda implementar un mismo comportamiento, es el concepto fundamental del polimorfismo. En esta aplicación se utilizó el concepto de interface y conversión de tipos.

Cuando se ejecuta la aplicación TestVehiculo el resultado es:

%java java_code.scjp6.TestVehiculo

.... Probando Conceptos de Encapsulacion, Herencia y Polimorfismo ....

Carro: ... Me muevo como un carro; en la tierra ...
          ... Nitrogeno suelto ...
Avion: ... Me muevo como un avion; en el aire ...
Tren: ... Me muevo como un tren; en rieles ...



Edwin A. Bratini
Computer Science Student - UASD
Cel.: 809-705-6361
edwin.bratini@gmail.com
edwin_bratini@hotmail.com

No hay comentarios:

Publicar un comentario