Duda sobre combinar métodos de una clase en otra

Iniciado por Beginner Web, 4 Abril 2019, 04:04 AM

0 Miembros y 1 Visitante están viendo este tema.

Beginner Web

Bueno tengo un Proyecto llamado ProyectoCelular y otro ProyectoCalculadora, quiero que la clase Celular del Proyecto ProyectoCelular pueda tener los metodos que tiene la clase Calculadora del ProyectoCalculadora ¿Cual es la forma correcta? Tener en cuenta que la clase Celular debe poder hacer uso de los metodos de la clase Calculadora

Código (java) [Seleccionar]

package principal;

import clases.Celular;
import clases.Calculadora;

public class ProyectoCelular {

   public static void main(String[] args) {
       // Esto es el main todavia no lo terminé
       
   }
   
}


Código (java) [Seleccionar]
package clases;

import java.lang.Math.*;

public class Calculadora {

   private String marca, modelo, sistemaOperativo, versionSistemaOperativo;

   public Calculadora(String marca, String modelo, String sistemaOperativo, String versionSistemaOperativo) {
       this.marca = marca;
       this.modelo = modelo;
       this.sistemaOperativo = sistemaOperativo;
       this.versionSistemaOperativo = versionSistemaOperativo;
   }

   /**
    *
    * @param a
    * @param b
    * @return La suma entre a y b
    */
   public float sumar(float a, float b) {
       return a + b;
   }

   /**
    *
    * @param a
    * @param b
    * @return La resta entre a y b
    */
   public float restar(float a, float b) {
       return a - b;
   }

   /**
    *
    * @param a
    * @param b
    * @return La multiplicación entre a y b
    */
   public double multiplicar(double a, double b) {
       if (a == 0 || b == 0) {
           return 0;
       } else {
           return a * b;
       }
   }

   /**
    *
    * @param a
    * @param b
    * @return La división entre a y b
    */
   public double dividir(float a, float b) {
       return a / b;
   }

   /**
    *
    * @param n
    * @return El factorial de un numero
    */
   public int factorial(int n) {
       if (n < 1) {
           return 1;
       } else {
           return n * factorial(n - 1);
       }
   }
   
   /**
    * @return the marca
    */
   public String getMarca() {
       return marca;
   }

   /**
    * @param marca the marca to set
    */
   public void setMarca(String marca) {
       this.marca = marca;
   }

   /**
    * @return the modelo
    */
   public String getModelo() {
       return modelo;
   }

   /**
    * @param modelo the modelo to set
    */
   public void setModelo(String modelo) {
       this.modelo = modelo;
   }

   /**
    * @return the sistemaOperativo
    */
   public String getSistemaOperativo() {
       return sistemaOperativo;
   }

   /**
    * @param sistemaOperativo the sistemaOperativo to set
    */
   public void setSistemaOperativo(String sistemaOperativo) {
       this.sistemaOperativo = sistemaOperativo;
   }

   /**
    * @return the versionSistemaOperativo
    */
   public String getVersionSistemaOperativo() {
       return versionSistemaOperativo;
   }

   /**
    * @param versionSistemaOperativo the versionSistemaOperativo to set
    */
   public void setVersionSistemaOperativo(String versionSistemaOperativo) {
       this.versionSistemaOperativo = versionSistemaOperativo;
   }

}


Código (java) [Seleccionar]

//Me parece que aca es donde tengo que poner algo de la clase Calculadora
package clases;

public class Celular {
   private String marca, modelo, color;
   private double precio;

   public Celular(String marca, String modelo, String color, double precio) {
       this.marca = marca;
       this.modelo = modelo;
       this.color = color;
       this.precio = precio;
   }

   /**
    * @return the marca
    */
   public String getMarca() {
       return marca;
   }

   /**
    * @param marca the marca to set
    */
   public void setMarca(String marca) {
       this.marca = marca;
   }

   /**
    * @return the modelo
    */
   public String getModelo() {
       return modelo;
   }

   /**
    * @param modelo the modelo to set
    */
   public void setModelo(String modelo) {
       this.modelo = modelo;
   }

   /**
    * @return the color
    */
   public String getColor() {
       return color;
   }

   /**
    * @param color the color to set
    */
   public void setColor(String color) {
       this.color = color;
   }

   /**
    * @return the precio
    */
   public double getPrecio() {
       return precio;
   }

   /**
    * @param precio the precio to set
    */
   public void setPrecio(double precio) {
       this.precio = precio;
   }
   
   
}


7w7

rub'n

#1
En el constructor de la clase Celular puedes añadir un parámetro tipo Calculadora, o un setter.

Vía herencia también. Cuando llegue a la casa te ayudo más estoy en la caverna del curro.





Bien aquí vamos, vamos a usar Herencia con la palabra reservada extends en la clase Celular

Otra vía es por medio de interfaces


Investigar
  • herencia simple de clases
  • Uso de super
  • Modificador de acceso protected

[/list]
Código (java) [Seleccionar]
package foro;
import java.lang.Math.*;
import java.util.logging.Logger;

/**
* Clase Calculadora
*/
public class Calculadora {

   private String marca;
   private String modelo;
   private String sistemaOperativo;
   private String versionSistemaOperativo;

   public static final Logger LOGGER = Logger.getLogger(ProyectoCelular.class.getSimpleName());

   public Calculadora() {
       super();
   }

   public Calculadora(String marca, String modelo, String sistemaOperativo, String versionSistemaOperativo) {
       this.marca = marca;
       this.modelo = modelo;
       this.sistemaOperativo = sistemaOperativo;
       this.versionSistemaOperativo = versionSistemaOperativo;
   }

   /**
    *
    * @param a
    * @param b
    * @return La suma entre a y b
    */
   public float sumar(float a, float b) {
       return a + b;
   }

   /**
    *
    * @param a
    * @param b
    * @return La resta entre a y b
    */
   public float restar(float a, float b) {
       return a - b;
   }

   /**
    *
    * @param a
    * @param b
    * @return La multiplicación entre a y b
    */
   public double multiplicar(double a, double b) {
       if (a == 0 || b == 0) {
           return 0;
       } else {
           return a * b;
       }
   }

   /**
    *
    * @param a
    * @param b
    * @return La división entre a y b
    */
   public double dividir(float a, float b) {
       return a / b;
   }

   /**
    *
    * @param n
    * @return El factorial de un numero
    */
   public int factorial(int n) {
       if (n < 1) {
           return 1;
       } else {
           return n * factorial(n - 1);
       }
   }

   /**
    * @return the marca
    */
   public String getMarca() {
       return marca;
   }

   /**
    * @param marca the marca to set
    */
   public void setMarca(String marca) {
       this.marca = marca;
   }

   /**
    * @return the modelo
    */
   public String getModelo() {
       return modelo;
   }

   /**
    * @param modelo the modelo to set
    */
   public void setModelo(String modelo) {
       this.modelo = modelo;
   }

   /**
    * @return the sistemaOperativo
    */
   public String getSistemaOperativo() {
       return sistemaOperativo;
   }

   /**
    * @param sistemaOperativo the sistemaOperativo to set
    */
   public void setSistemaOperativo(String sistemaOperativo) {
       this.sistemaOperativo = sistemaOperativo;
   }

   /**
    * @return the versionSistemaOperativo
    */
   public String getVersionSistemaOperativo() {
       return versionSistemaOperativo;
   }

   /**
    * @param versionSistemaOperativo the versionSistemaOperativo to set
    */
   public void setVersionSistemaOperativo(String versionSistemaOperativo) {
       this.versionSistemaOperativo = versionSistemaOperativo;
   }

   @Override
   public String toString() {
       final StringBuilder sb = new StringBuilder("\nCalculadora");
       sb.append("\nmarca='").append(marca).append("\n");
       sb.append(", modelo='").append(modelo).append("\n");
       sb.append(", sistemaOperativo='").append(sistemaOperativo).append("\n");
       sb.append(", versionSistemaOperativo='").append(versionSistemaOperativo).append("\n");
       return sb.toString();
   }
}


Cuando establecemos herencia, de una clase con un constructor definido como el tuyo, debemos invocarlo con super() y si tiene parámetros setearselos
en este caso la clase celular tiene 2 atributos propios de ella, el color y precio, entonces, bastaría con dejar los setters/getters de color y precio, ya que los otros se heredan

La visibilidad de los atributos/variables de instancia, siendo protected tendrán visibilidad en el mismo paquete, para verlas desde otro paquete deben ser publicas, pero por convención en java, deberían ser en lo posible declaradas como private, accediendo a ellas via getters



Código (java) [Seleccionar]
package foro;

/**
* Clase Celular
*/
public class Celular extends Calculadora { // extendemos a Calculadora

   //private String marca;
   //private String modelo;  // estas dos variables no hacen falta, porque se heredan tambien
   private String  color;
   private double precio;

   /**
    * Nuevo constructor vacio
    */
   public Celular() {
       super(); // super invoca al constructor de la clase Calculadora
   }

   public Celular(String marca, String modelo, String color, double precio, String sistemaOperativo, String versionSistemaOperativo) {
       /**
        * con este super invocamos al constructor de la clase Calculadora, seteandole los parametros
        * correspondientes chavalina.
        */
       super(marca,modelo, sistemaOperativo,versionSistemaOperativo);
       this.color = color;
       this.precio = precio;
   }

   /**
    * @return the marca
    */
   public String getMarca() {
       return marca;
   }

   /**
    * @param marca the marca to set
    */
   public void setMarca(String marca) {
       this.marca = marca;
   }

   /**
    * @return the modelo
    */
   public String getModelo() {
       return modelo;
   }

   /**
    * @param modelo the modelo to set
    */
   public void setModelo(String modelo) {
       this.modelo = modelo;
   }

   /**
    * @return the color
    */
   public String getColor() {
       return color;
   }

   /**
    * @param color the color to set
    */
   public void setColor(String color) {
       this.color = color;
   }

   /**
    * @return the precio
    */
   public double getPrecio() {
       return precio;
   }

   /**
    * @param precio the precio to set
    */
   public void setPrecio(double precio) {
       this.precio = precio;
   }

   @Override
   public String toString() {
       final StringBuilder sb = new StringBuilder();
       sb.append(super.toString());
       sb.append("\ncolor='").append(color).append("\n");
       sb.append(", precio=").append(precio);
       return sb.toString();
   }
}


Código (java) [Seleccionar]
package foro;


public class ProyectoCelular {

   public static void main(String[] args) {
       // Esto es el main todavia no lo terminé

       final Celular celular = new Celular();
       /**
        * Configurando por medio de setters NO-THREAD-SAFE
        */
       celular.setColor("Rojo");
       celular.setMarca("Samsung");
       celular.setModelo("I9300");
       celular.setPrecio(200);
       celular.setSistemaOperativo("Android KitKat");
       celular.setVersionSistemaOperativo("4.4.4");

       /**
        * Todos ellos retornan un valor
        * que puedes mostrar con la consola o logger, logger es lo mas correcto
        */
       celular.factorial(2);
       celular.dividir(2,3);
       celular.sumar(2,3);
       celular.restar(5,1);
       celular.multiplicar(5,5);

       Calculadora.LOGGER.info(celular.toString());
   }

}



Estamos en presencia de un constructor telescópico, muchos parámetros a veces difícil de usar, coste de mantenimiento, legibilidad etc, patrón Builder es la solución.

A simple vista pensarías, bueno me creo otro constructor y le añado parámetros, pero vienes de nuevo y añades otro y así, nunca terminara, o este mismo contructor añadirle mas parámetros.

O la típica vía de usar setters, NO-THREAD-SAFE, es decir no Inmutable(Como String, StringBuffer, la api LocalDate del paquete java.time), si usas ese bean en un Thread podrian pasar cosas raras y difíciles de resolver.  >:D tema que, podemos tratar luego.


Código (java) [Seleccionar]
public Celular(String marca, String modelo, String color, double precio, String sistemaOperativo, String versionSistemaOperativo) {
       /**
        * con este super invocamos al constructor de la clase Calculadora, seteandole los parámetros
        * correspondientes chavalina.
        */
       super(marca,modelo, sistemaOperativo,versionSistemaOperativo);
       this.color = color;
       this.precio = precio;
   }


Recuerda retomar este hilo y estudiarlo bien , donde tienes otro ejemplo de herencia https://foro.elhacker.net/java/metodo_mostrar_todos_los_atributos_de_un_objeto_por_pantallaresuelto-t494141.0.html


En la clase Celular te puse unos bugs que debes de resolver, recuerda que hay métodos en la clase Celular que no te hacen falta, es decir, puedes quitarlos, debido a que los heredas


rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen