Clases, métodos, herencia, constructores y POO

21 marzo 2009


Guía de Laboratorio 2: Métodos, Constructores y Herencia


Auxiliar de Cátedra: Hugo Alejandro Barrientos



Esta guía de práctica es una continuación de la número 1 en donde se realizó un programa básico en modo consola, llamado cariñosamente “Silabario para programadores principiantes”. Ahora, lo diseñaremos en base a clases bien encapsuladas, que contengan sus métodos y propiedades, getters y setters, además de la implementación de la herencia simple, la única soportada nativamente en Java.

Además, como un refuerzo se explicará la función super(), propia de nuestro lenguaje de programación.


SUPER()
Si se necesita llamar al método padre dentro de una clase que ha reemplazado ese método, se puede hacer referencia al método padre con la palabra clave super().

Cuando se declara una clase heredando explícitamente de otra como en el código siguiente:


class base {
int datoBase;

public base() {
System.out.println( "Dentro del Constructor de la clase base" );
System.out.println( "Asignando a datoBase 100" );
datoBase = 100;
}
}


class hijoBase extends base {
int datoSubClase;

// Constructor de la Subclase
public hijoBase() {
// Llamada al constructor de la clase base
super();
System.out.println( "Dentro del Constructor de la subclase" );
System.out.println( "Asignando a datoSubClase 200" );
datoSubClase = 200;
}

El programa también utiliza super para invocar al constructor de la superclase desde el constructor de la subclase.

PREGUNTA: Si instanciamos la clase hijoBase, ¿Cuál es la impresión en consola de la porción de código de arriba?

También sirve para llegar a atributos de las superclases. De la siguiente manera:

class ave{

String nombre;
String colorPlumas;
}

class pato extends ave{

public pato(){
super.colorPlumas=”Blanco”;
}
}
Instanciando la clase pato podemos acceder a la propiedad colorPlumas, que está definida como propiedad de un ave.

Pregunta: ¿Existe la herencia múltiple en Java? ¿Por qué?

Esta guía se encargará de fortalecer los conceptos de clases, métodos, propiedades o atributos, herencia, constructores y acerca de los métodos Get y Set. Todo esto con ayuda del programa realizado en la guía anterior con nuestro “Silabario para programadores”. El trabajo estructurado de la semana pasada ahora lo traslademos a una aplicación, siempre en el ambiente consola, en la cual definamos con un alto grado de encapsulamiento, las clases que harán posible la realización de la aplicación y llevarán definida todo el funcionamiento, o lo que es mismo, la capa de negocios del programa.


El ejemplo es sencillo. El Silabario lo que realiza es una serie de operaciones básicas que resuelven 4 tipos de problemas distintos: El factorial de número, la tabla de multiplicar de un número, la clasificación de la edad del usuario y la elección de la estación del año favorita del usuario. El silabario además, tiene la característica que el programador escogerá la sentencia o instrucción básica que brinde la solución más sencilla y óptima para cada uno de los problemas.

Para efectos de esta práctica, y porque creo que es la mejor manera de poder apreciar las clases y objetos de este ejercicio, definiremos cada clase como una clase “Operación”, que es la que facilitará y tendrá las herramientas necesarias para efectuar la resolución de cada uno de los problemas.

Un objeto operación necesita de propiedades o atributos. Una operación necesita de operadores, uno, dos ó más. Es por eso que definiremos dos atributos para realizar dichas operaciones. Con dos bastarán para este ejercicio.
Los métodos de esta clase son muy variados. Cada una de las operaciones realizará uno diferente, por lo tanto no cabe dentro de la percepción de un objeto “Operación” básico, la definición de cada uno de los métodos.
Los métodos que sí se necesitarían son los populares métodos GET y SET, que nos sirven para leer y cambiar los valores de una propiedad específica. Como hemos definido propiedades, éstas necesitan de sus getters y setters. La clase de una Operación Básica para el silabario quedará así:


public class operacionBase {

protected int operador;

public operacionBase(){
this.operador=0;
}

public void setOperador(int o){
this.operador=o;
}

public int getOperador(){
return this.operador;
}
}

Declaramos la propiedad con visibilidad protected por motivos de seguridad, para que solamente los miembros de esa clase y los que heredan de ella, es decir las subclases, puedan accesar a estos atributos.

Como hemos definido ya una clase base, ahora podremos definir el resto de clases que podrán heredar de la clase base. Cabe destacar que no siempre se podrá hacer una clase base y con respecto a esta empezar a heredarles a otras. Esto depende de la naturaleza de cada aplicación, y de la manera de cómo el programador diseñe su capa de negocios.

Para realizar la clase que nos devuelva el factorial de un número, el programador puede escoger la instrucción While. Por lo tanto el programador debe desarrollar el método que reciba como parámetro el número del que se desee el factorial y que devuelva el resultado esperado. Heredando de la clase base, tenemos ya garantizados los atributos y métodos propios de la misma, por lo tanto, la clase para realizar el factorial del número podría quedar así:


public class operacionFactorial extends operacionBase{


public operacionFactorial(){
super();
}

public int devolverFactorial(){
int factorial=1;
int cont=1;

while (cont <= this.operador) { factorial *= cont; cont++; } return factorial;
}
}

El diagrama UML nos ayudará a comprender mejor la herencia y estructura de estas clases:


Como puede observar el programador, se utiliza la propiedad “operador” cuya definición pertenece a la clase base. Sin embargo, como la clase “operacionFactorial” hereda todos los atributos y métodos de la clase básica, podemos hacer un llamado a dicha propiedad con la ayuda de la sentencia “this”.

PREGUNTAS: ¿Trabajaría igual el constructor si se suprime la sentencia super()? ¿Cómo capturo las variables que el usuario ingresa y se las transmito a la función devolverFactorial()?


Ejercicio:

Realizar la siguiente aplicación utilizando clases, herencia, métodos, propiedades, constructores y los métodos GET y SET:

• Desarrollar un ecosistema, en donde se puedan crear tener distintos animales de todas las clasificaciones: mamíferos, aves, reptiles y anfibios.
• Se deben de crear clases para cada tipo de especie, y para las especies más comunes que el programador quiera definir.
• El usuario final debe tener la potestad de crear todos los animales (instancias) que desee, y diferenciarlas de acuerdo a algún identificador. Se deben de poder plasmar en la consola la lista de animalitos creados

Ejercicios propuestos:

Desarrollar un programa en Java con todos los elementos vistos en este laboratorio que maneje las disciplinas deportivas que se practican en unos juegos olímpicos, con la misma dinámica del ejercicio anterior.