sábado, 8 de febrero de 2014

Práctica de herencia con Punto, Circulo y Cilindro.

Pues en esta práctica implementaremos un Punto, luego un Círculo que esté formado por un entero (radio) y un punto (centro) y luego un Cilindro formado por un Círculo (base) y un entero (altura). Aquí tenéis el esquema UML

Como test de prueba usaremos el siguiente:

public class TestCilindro {
 public static void main(String[] args) {
  Punto centroBase = new Punto(3.0, 5.0);
  Circulo base = new Circulo(centroBase, 4.0);
  Cilindro miCilindro = new Cilindro(base, 10.0);
  System.out.println(miCilindro);
  miCilindro.trasladar(2.0, 2.0);
  System.out.println(miCilindro);
  System.out.println(
  new Cilindro(new Circulo(new Punto(3.0, 5.0),4.0),10.0));
  }
 }



Ahora paso a daros los resultados. Primero el del Punto:
public class Punto {

 private double x;
 private double y;
 
 public Punto() {
  x = 0;
  y = 0;
 }
 public Punto(double a, double b) {
  x = a;
  y = b;
 }
 
 public double x() {return x;}
 public double y() {return y;}
 
 public double distancia(Punto p) {
  double dist = 0;
  double distX = Math.abs(x-p.x);
  double distY = Math.abs(y-p.y);
  distX *= distX;
  distY *= distY;
  dist = Math.sqrt(distX+distY);
  
  return dist;
 }

 public void x(double a) {x = a;}
 public void y(double a) {y = a;}
 
 public void trasladar(double a, double b) {
  x += a;
  y += b;
 }
 
 public String toString() {
  return "("+x+", "+y+")";
 }
 
}

El del Círculo:
public class Circulo extends Punto{
 
 private Punto centro;
 private double radio;
 
 public Circulo() {
  centro = new Punto();
  radio = 1;
 }
 public Circulo(Punto pto, double rad) {
  centro = pto;
  radio = rad;
 }

 public Punto centro() {return centro;}
 public double radio() {return radio;}
 
 public void centro(Punto pto) {centro = pto;}
 public void radio(double rad) {radio  = rad;}
 public void trasladar(double a, double b) {
  centro.trasladar(a, b);
 }
 public String toString() {
  String center = centro.toString();
  return "El centro es "+center+" y el radio mide " + radio;
 }
 
}

Y el del Cilindro :)
public class Cilindro extends Circulo{
 private Circulo base;
 private double altura;
 
 public Cilindro() {
  base = new Circulo();
  altura = 1;
 }
 public Cilindro(Circulo bs, double alt) {
  base = bs;
  altura = alt;
 }

 public Circulo base() {return base;}
 public double altura() {return altura;}
 public void base(Circulo bs) {base = bs;}
 public void altura(double alt) {altura = alt;}
 
 public void trasladar(double a, double b) {
  base.trasladar(a, b);
 }
 public String toString() {
  String bass = "Las características de la base son: "+base.toString();
  return bass + " y la altura es de " + altura;
 }
}

Eso es todo. Espero que os quede claro todo lo que significa la herencia.

Saludos ;)

6 comentarios:

  1. Esta genial la pagina!
    Cuando solicitas un atributo o quieres cambiar el valor del atributo, por ejemplo, esta parte del código:

    // Solicitando Valores:
    public Circulo base() {return base;}
    public double altura() {return altura;}
    // Cambiando Valores:
    public void base(Circulo bs) {base = bs;}
    public void altura(double alt) {altura = alt;}


    Te recomiendo que cambies el nombre de los métodos, de modo que se pueda leer mejor cuando los llamas en el método "main". Algo así:

    // Solicitando Valores:
    public Circle getBase() {return this.base;}
    public double getHeight() {return this.height;}
    // Cambiando Valores:
    public void setBase(Circle base) {this.base = base;}
    public void setHeight(double height) {this.height = height;}

    ResponderEliminar
    Respuestas
    1. Sí, la verdad es que llevas razón y lo normal es crear métodos set y get (es común). A ver si saco tiempo y lo modifico que últimamente estoy hasta arriba entre el curro y los estudios.

      En mi defensa diré que ése código lo hice cuando llevaba dos semanas en la carrera :P

      GENTEE!! USAD SIEMPRE GETS PARA OBTENER VALORES DEL OBJETO Y SETS PARA CAMBIARLOS. SE TRATA DE CÓDIGO LIMPIO. HACED LO QUE OS DIGA Y NO LO QUE YO HAGA XD

      En serio, gracias e intentaré acordarme de cambiarlo.

      Saludos;)

      Eliminar
  2. hola, estoy aprendiendo a programar en java y no entiendo para que se usa :

    public void x(double a) {x = a;}
    public void y(double a) {y = a;}

    ResponderEliminar
    Respuestas
    1. Eso sirve para poder editar el objeto. Si creamos un objeto Punto p y queremos editar que el x sea 5 pues ponemos p.x(5); y si queremos cambiarlo otra vez a 8 pues p.x(8);

      Saludos;)

      Eliminar
  3. Algo tan pequeño lo estas complicando para el que no sabe. Son los métodos setter. Seria lo mismo pero más claro si pusieses esto:

    public class Punto {

    private double x;
    private double y;

    public Punto() { // por defecto el punto se sitúa en x=0 e y=0
    x = 0;
    y = 0;
    }
    public Punto(double x, double y) { // uso las mismas variables para no confundir.
    this.x = x;
    this.y = y;
    }

    public double getX() {return this.x;}
    public double getY() {return this.y;}

    public double distancia(Punto p) {
    double distancia = 0; // distancia del punto
    double distanciaX = Math.abs(this.x - p.getX); // distancia del componente X del punto
    double distanciaY = Math.abs(this.y - p.getY); // distancia del componente Y del punto
    distancia = Math.sqrt(Math.pow(distanciaX,2) + Math.pow(distanciaY, 2));

    return distancia;
    }

    public void setX(double x) {this.x = x;}
    public void setY(double y) {this.y = y;}

    public void trasladar(double x, double y) {
    this.x += x;
    this.y += y;
    }

    @override
    public String toString() {
    return "(" + this.x + ", " + this.y + ")";
    }

    }

    This hace referencia a la propia clase, y añadiendole las propiedades o atributos de la clase this.x o this.y se distinguen de variables locales con el mismo nombre.

    Esto es esencial para hacer codigo limpio y que se entienda.

    ResponderEliminar
  4. hola necesito una ayuda urgente, necesito armar un proyecto de cilindro que luego herede en otra case TCilindrohueco, necesito que me de como mensaje volumen, perimetro interio,perimetro exterior.
    si alquien me puede ayudar le voy agradecer.
    saludos

    ResponderEliminar