RSS

Deberes – Declarando Clases (II)

16 Abr

Vamos a programar los siguientes casos:

  • Caso 3: Realizar una clase abstracta (Vehiculo) y varias clases que la concreten (Coche, Bicicleta).
  • Caso 4: Realizar una clase final (ImporteCuenta) y demostrar que no se puede extender.

Para ver los ejercicios resueltos click en Leer más…

Caso 3

Vamos a definir la clase abstracta Vehículo, que tendrá como atributos: la marca, el peso, el color, el número de asientos y la velocidad. Definimos un método abstracto acelerar, que incrementará la velocidad inicial del vehículo dependiendo de cada clase hija. También definimos un método verDetalles para escribir los valores del objeto.

public abstract class Vehiculo {

private String marca;
private int peso;
private String color;
private int numAsientos;
private int velocidad;

/*Se podría marcar el constructor public pero tiene mas
/sentido que sea protected porque solo llamaran las subclases.*/
protected Vehiculo (String marca, int peso, String color, int numAsientos, int velocidad)
{
this.marca = marca;
this.peso = peso;
this.color = color;
this.numAsientos = numAsientos;
this.velocidad = velocidad;
}

protected int getPeso()
{
return peso;
}

protected void setPeso(int peso)
{
this.peso = peso;
}
protected String getColor() {
return color;
}

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

protected int getNumAsientos() {
return numAsientos;
}

protected void setNumAsientos(int numAsientos) {
this.numAsientos = numAsientos;
}

protected String getMarca() {
return marca;
}

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

protected int getVelocidad() {
return velocidad;
}

protected void setVelocidad(int velocidad) {
this.velocidad = velocidad;
}

//método abstracto que se implementará en las subclases.
protected abstract void acelerar();

//este metodo no se usará ya que lo tenemos redefinido
//en las clases Coche y Bicicleta.
protected void verDetalles(){
System.out.println("Vehiculo: \n marca:" + getMarca()
+ " peso: " + getPeso()
+ " color : " + getColor()
+ " numAsientos: " + getNumAsientos()
+ " velocidad: " + getVelocidad());
}
}

Ahora definiremos dos subclases, Coche y Bicicleta. Darán código al método abstracto acelerar() y redefinirán el método verDetalles(). Coche además añade algunos atributos.

public class Coche extends Vehiculo{

	private boolean itv;
	private int cilindros;

	public  Coche(String marca, int peso, String color, int numAsientos, int velocidad, boolean itv, int cilindros)
	{
		super(marca, peso, color, numAsientos, velocidad);
		this.itv = itv;
		this.cilindros = cilindros;
	}

	public boolean isItv() {
		return itv;
	}

	public void setItv(boolean itv) {
		this.itv = itv;
	}

	public int getCilindros() {
		return cilindros;
	}

	public void setCilindros(int cilindros) {
		this.cilindros = cilindros;
	}

    public void acelerar()
    {
    	setVelocidad(getVelocidad() + 100);
    }

    public void verDetalles(){
		 System.out.println("Coche: \n marca:" + getMarca()
				 + " peso: " + getPeso()
				 + " color : " + getColor()
				 + " numAsientos: " + getNumAsientos()
				 + " velocidad: " + getVelocidad()
				 + " itv: " + isItv()
				 + " cilindros: " + getCilindros());
	}

}

public class Bicicleta extends Vehiculo {

	public Bicicleta(String marca, int peso, String color, int numAsientos,
			int velocidad) {
		super(marca, peso, color, numAsientos, velocidad);

	}

	public void acelerar() {
		setVelocidad(getVelocidad() + 10);
	}

	public void verDetalles(){
		 System.out.println("Bicicleta: \n marca:" + getMarca()
				 + " peso: " + getPeso()
				 + " color : " + getColor()
				 + " numAsientos: " + getNumAsientos()
				 + " velocidad: " + getVelocidad());
	}

}

Ahora escribimos un programa principal para probar estas clases:

public class Principal {

	public static void main(String[] args) {

		//Da fallo porque no se puede instanciar directamente.
		//Vehiculo v = new Vehiculo();

		Coche c = new Coche("Toyota", 2000, "Blanco", 4, 0, true, 4);
		c.verDetalles();
		c.acelerar();
		c.verDetalles();

		Bicicleta b = new Bicicleta("Orbea", 3, "Azul", 1, 0);
		b.verDetalles();
		b.acelerar();
		b.verDetalles();

	}
}

Ejecutamos:

Caso 4

Creamos la clase ImporteCuenta con los siguientes atributos: codigoCuenta, tipoProducto, importeCuenta e impComision.

Si no la declararamos como final, podría suceder que en la clase hija, pudieramos definir un método que incrementara el importe de la cuenta.

Vamos a verlo:


package paqueteC;

public  class ImporteCuenta {

String codigoCuenta;
String tipoProducto;
float importeCuenta;
float impComision;

public ImporteCuenta()
{
codigoCuenta = "XXX00000";
tipoProducto = "Cta. Corriente";
importeCuenta = 0;
impComision = 0;
}

public ImporteCuenta(String codigoCuenta, String tipoProducto, float importeCuenta, float impComision)
{
this.codigoCuenta = codigoCuenta;
this.tipoProducto = tipoProducto;
this.importeCuenta = importeCuenta;
this.impComision = impComision;
}

public String getCodigoCuenta() {
return codigoCuenta;
}

public void setCodigoCuenta(String codigoCuenta) {
this.codigoCuenta = codigoCuenta;
}

public String getTipoProducto() {
return tipoProducto;
}

public void setTipoProducto(String tipoProducto) {
this.tipoProducto = tipoProducto;
}

public float getImporteCuenta() {
return importeCuenta;
}

public void setImporteCuenta(float importeCuenta) {
this.importeCuenta = importeCuenta;
}

public float getImpComision() {
return impComision;
}

public void setImpComision(float impComision) {
this.impComision = impComision;
}

public void verDetalles(){
System.out.println("Datos cuenta: \n codCuenta: " + this.getCodigoCuenta()
+ "\n tipoProd: " +  tipoProducto + "\n impCuenta:  " +  importeCuenta
+ "\n impComision:  " +  impComision);
}

}


package paqueteC;

public class ImporteCuentaHija extends ImporteCuenta {

public ImporteCuentaHija() {
super();
}

public ImporteCuentaHija(String codigoCuenta, String tipoProducto, float importeCuenta, float impComision){
super( codigoCuenta, tipoProducto, importeCuenta, impComision);
}

public void aumentarImporte(int importe)
{
this.setImporteCuenta(getImporteCuenta() + importe);

}


package paqueteC;

public class Principal {

public static void main(String[] args) {

ImporteCuentaHija impCuentaPlazo = new ImporteCuentaHija("IPF00001", "IPF", 2100.23F, 1.2F);
impCuentaPlazo.aumentarImporte(300000);

impCuentaPlazo.verDetalles();
}
}

Ejecutamos y vemos que aumentamos el importe:

Si la modificamos y la declaramos ImporteCuenta como final, vemos que ya no permite extenderla. Da error de compilación.

Anuncios
 
Deja un comentario

Publicado por en 16 abril, 2011 en Deberes

 

Etiquetas: , , ,

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

 
A %d blogueros les gusta esto: