Programación Orientada a Objetos (Parte II) – Encapsulamiento, Herencia y Polimorfismo

Continuando con el post anterior sobre POO, procederemos a aclarar los términos de Encapsulación, Herencia y Polimorfismo.

Antes de ver estos temas, vamos a ver lo que se denomina Sobrecarga de operadores, lo que se refiere a la posibilidad de que tener una misma función, pero que se comporte de distinta manera dependiendo de los parámetros que le entreguemos, por ejemplo, nuestro constructor de la clase Vehiculo actualmente recibe como parámetro un String correspondiente a la patente, pero supongamos que no tenemos la patente, podemos crear otro constructor que no reciba parámetros y le asigne los valores que definamos nosotros a nuestro objeto, veamos un ejemplo de 4 constructores con distintos parámetros:


public Vehiculo(String patente, int velocidad) {
 this.patente = patente;
 this.velocidad = velocidad;
 }

public Vehiculo(int velocidad) {
 this.patente = "No asignada";
 this.velocidad = velocidad;
 }

public Vehiculo(String patente) {
 this.patente = patente;
 this.velocidad = 0;
 }

 public Vehiculo() {
 patente = "No asignada";
 velocidad = 0;
 }

Podemos notar que es posible implementar un constructor que acepte distinta cantidad de parámetros, y dependiendo de como instanciemos el objeto, los valores iniciales serán distintos. Por ejemplo:


Vehiculo miVehiculo1 = new Vehiculo("AB1234",50);//Patente: "AB1234", Velocidad: 50
 Vehiculo miVehiculo2 = new Vehiculo(50);//Patente: "No asignada", Velocidad: 50
 Vehiculo miVehiculo3 = new Vehiculo("AB1234");//Patente: "AB1234", Velocidad: 0
 Vehiculo miVehiculo4 = new Vehiculo();//Patente: "No asignada", Velocidad:

Nota: La sobrecarga de operadores se aplica a cualquier función que queramos, no solo a los constructores.

Encapsulación

La encapsulación se refiere al hecho de “ocultar” una variable de nuestra clase hacia el exterior, veamos un ejemplo relativo a nuestra clase Vehiculo. Supongamos queremos saber el valor de la velocidad, para acceder al valor, simplemente tendríamos que hacer:

System.out.println("Velocidad: " + vehiculo.velocidad );//Mostrar velocidad
vehiculo.velocidad = 10;//Asignar velocidad

Pero supongamos que nosotros no queremos que se pueda acceder de esta manera (por ejemplo, en el contexto que tengamos una clase Cliente, perteneciente a un banco, nosotros no queremos que se pueda cambiar el valor del saldo del cliente desde afuera de la clase), por lo tanto, tendríamos que hacer una encapsulación de nuestra variable (en este caso, la variable velocidad), para esto, en la declaración de nuestra variable, debemos anteponer la palabra reservada private antes del tipo de nuestra variable, con esto, le estamos diciendo que nuestra variable solo puede ser vista desde dentro de nuestra clase (es decir, solo podremos acceder a ella desde las funciones internas de nuestra clase). Aquí un ejemplo de como convertir nuestra varible velocidad en privada:

private int velocidad;

Ahora si intentamos acceder a nuestra variable velocidad, no podremos hacerlo. Nota: las variables que no anteponen ninguna palabra antes del tipo, se asume que son publicas (que es la manera en la que hemos usado hasta ahora).Ahora, supongamos que queremos acceder al valor de la variable (por ejemplo si queremos hacer una consulta de saldo en otra aplicación), pero no queremos que se modifique desde afuera, para esto, simplemente debemos crear una función que nos retorne el valor, tal como sigue:

public int getVelocidad() {
return velocidad;
}</pre>

La función anterior, suele llamarse getter en el mundo de la programación, por el otro lado, existe una función setter, la cual se encarga de asignar un valor, esto se hace para tener control total de lo que podemos y no podemos hacer con nuestra variable, aquí les dejo un ejemplo de un setter:

public void setVelocidad(int velocidad) {</pre>
this.velocidad = velocidad;
}
<pre>

Quiero aclarar que el término getter y setter son solo convenciones utilizadas, básicamente es decir que creamos una función para obtener un dato especifico (getter) y otra función para asignar un dato específico (setter).

Si aun no queda claro, quiero hacer notar la diferencia entre public y private. Cuando decimos que una variable, clase, función, etc. es de tipo public, estamos diciendo que se puede acceder desde cualquier parte a ella, si decimos que es private, estamos diciendo que sólo se podrá acceder a ella desde dentro de la clase donde se declara.

También existe otro tipo de control de acceso, el cual es de tipo protected, esto quiere decir que solamente se puede acceder a variables, funciones, etc. de este tipo solamente desde la clase en donde se declara, y las clases heredadas de esta.

Herencia

La herencia se refiere a que podemos “heredar” una clase más general, a otra menos general. Por ejemplo, nuestra clase Vehiculo es una clase general, debido a que existen varios tipos de vehículo, como autos, motos, camionetas, etc. Lo que hace la herencia, es obtener los datos comunes a todos los vehículos y aplicarlos a uno en específico. Por ejemplo, implementaremos una clase Auto, heredada de la clase Vehiculo:


public class Auto extends Vehiculo {//Auto hereda de Vehiculo

int volumenMaletera;

public static void main(String Args[]) {
         Auto miAuto = new Auto(100, "AB1234", 100);
         miAuto.VerDatos();
     }

public Auto(int volumenMaletera, String patente, int velocidad) {
         super(patente, velocidad);
         this.volumenMaletera = volumenMaletera;
}
}

Notamos que nuestra clase Auto hereda de la clase Vehiculo, es decir, posee todas las variables y metodos de la clase Vehiculo (declarados como public y protected, los privados, no). Por lo tanto, podemos acceder a la función VerDatos() como se mostró en el código anterior. Además de añadirle variables propias de un auto (como por ejemplo el volumen de la maletera, no todos los vehículos poseen maletera, como por ejemplo, las motos).

Polimorfismo

Supongamos queremos implementar una función que acelere a nuestro vehículo, no podemos implementar esta función en la clase vehículo, debido a que no todos los vehículos funcionan de igual manera (el algoritmo para acelerar un autor no es igual al algoritmo para acelerar una moto, para el auto hay que hacer varios movimientos tales como presionar el embrague, acelerar, etc., para una moto solo es necesario acelerar). El polimorfismo trata de declarar una función pero no implementarla, con el objetivo de que si o si las clases que la heredan tienen que implementar este método.

Para implementar esto, en nuestra clase Vehiculo debemos declarar esta función, pero no implementarla.

</pre>
public abstract class Vehiculo {

String patente;
private int velocidad;

abstract void acelerar();
//...
}
<pre>

Notamos que añadimos la palabra reservada abstract en la declaración de nuestra clase (para decir que dejaremos funciones sin implementar), además de añadirla a función acelerar(). Esto quiere decir que si o si tendremos que implementar esta función si heredamos esta clase.

Para implementar esta función, debemos escribir @Override arriba de la función que implementaremos (en nuestra clase Auto).

</pre>
@Override
 void acelerar() {
System.out.println("Presionando embrague...");
System.out.println("Moviendo los cambios...");
System.out.println("Soltando embrague y acelerando...");
 }
<pre>

Esto sería por ahora, lamento si las explicaciones son muy rápidas, pero ando con el tiempo ajustado por la Universidad.
Espero les sea de utilidad. Cualquier duda, comentenla.

Post Anterior: Programación Orientada a Objetos (Parte I) – Introducción

Anuncios

5 pensamientos en “Programación Orientada a Objetos (Parte II) – Encapsulamiento, Herencia y Polimorfismo

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s