Atributo de tipo "clase" : no entiendo nada

Iniciado por men100, 18 Enero 2018, 18:02 PM

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

men100

Buenas tardes. Estoy haciendo DAW y empieza a complicarse el asunto y estoy algo perdido. Os pego la parte del enunciado y que no entiendo resaltado en negrita:


CitarEn esta tarea se van a realizar un conjunto de clases que permitan modelar las distintos tipos de cuentas que una persona puede tener en un banco, haciendo uso del mecanismo de herencia. Los puntos que se deben tratar para resolver la tarea son:


Crear un proyecto en NetBeans denominado, "CuentasBancarias".

Dentro de dicho proyecto, crear un paquete denominado "modeloBancario".

Dentro del paquete "modeloBancario", crear una clase denominada Cliente, que modele los distintos clientes del banco que tienen una cuenta asociada para almacenar su dinero. Las características de la clase Cliente son:
Atributos (Todos los atributos de la clase Cliente deben tener visibilidad privada):

idCliente: número entero que representa el identificador único del cliente dentro del banco.
nombre: cadena de caracteres que representa el nombre del cliente del banco.
direccion: cadena de caracteres que representa la dirección donde vive el cliente del banco.
teléfono: cadena de caracteres que representa el teléfono que permite contactar con el cliente.

Métodos (Todos los métodos de la clase Cliente deben tener visibilidad pública):
constructor sin parámetros: constructor que inicializa todos los atributos de tipo cadenas de caracteres al valor null y los números enteros a 0.
constructor con parámetros: constructor que tienen tantos parámetros como atributos tiene la clase, y que inicializa cada uno de los atributos con el valor de los parámetros correspondientes.

Dentro del paquete "modeloBancario", crear una clase abstracta denominada "Cuenta", que modele las distintas cuentas bancarias que mantiene la entidad financiera donde los clientes depositan su dinero.
Atributos (Todos los atributos de la clase Cuenta deben tener visibilidad protegida)

numeroDeCuenta: número entero que representa el identificador único asociado a cada una de las cuentas del banco.
saldo: número real que representa la cantidad de dinero almacenado en dicha cuenta.
titular: atributo de tipo Cliente que representa la persona que está asociada a dicha cuenta.

Métodos (Todos los métodos de la clase Cuenta deben tener visibilidad pública)
constructor sin parámetros: constructor que inicializa el cliente titular de la cuenta a null, y el saldo y el número de cuenta a cero.
constructor con parámetros: constructor que tienen tantos parámetros como atributos tiene la clase, y que inicializa cada uno de los atributos con el valor de los parámetros correspondientes.
getNumeroDeCuenta: método que permite obtener el número de cuenta.
getSaldo: método que permite obtener el saldo de la cuenta.
getTitular: método que permite obtener el titular de la cuenta  
setNumeroDeCuenta: método que recibe un parámetro entero que representa el nuevo número de cuenta que se desea asignar y asigna parámetro el valor de dicho al atributo numeroDeCuenta.
setSaldo: método que recibe un parámetro entero que representa el nuevo saldo que se desea asignar y asigna parámetro el valor de dicho al atributo saldo.
setTitular: método que recibe un parámetro Cliente que representa el nuevo titular que se desea asignar y asigna parámetro el valor de dicho al atributo titular.
ingresar: recibe un parámetro real que representa la cantidad que se desea ingresar en la cuenta. El método incrementará el saldo en la cantidad recibida como parámetro.
retirar: método abstracto que permitirá sacar una cantidad de la cuenta (si hay saldo disponible para ello), no se implementará ya que dependerá del tipo de cuenta, por tanto su implementación recaerá en las clases hijas.
actualizarSaldo: método abstracto que actualizará el saldo de la cuenta, dependiendo del tipo de interés de cada una de las cuenta, por tanto su implementación recaerá en las clases hijas.

Ahí me pierdo, no entiendo que quiere decir  "tipo Cliente". Osea, debe de ser que ese atributo sea la clase entera llamada "Cliente". Os pongo lo que he hecho hasta ahora:

Clase "Cliente":

Código (java) [Seleccionar]


package modeloBancario;

public class Cliente {
   
   private int idCliente;
   private String nombre;
   private String direccion;
   private String telefono;
   
   public Cliente (){
       
   }
   
   public Cliente (int idCliente, String nombre, String direccion, String telefono){
       
       this.idCliente = idCliente;
       this.nombre = nombre;
       this.direccion = direccion;
       this.telefono = telefono;
       
   }
   
   public int getIdCliente(){
       return idCliente;
   }
   
   public void setIdCliente(int idCliente){
       this.idCliente = idCliente;
   }
   
   public String getNombre(){
       return nombre;
   }
   
   public void setNombre(String nombre){
       this.nombre = nombre;
   }
   
   public String getDireccion(){
       return direccion;
   }
   
   public void setDireccion(String direccion){
       this.direccion = direccion;
   }
   
   public String getTelefono(){
       return telefono;
   }
   
   public void setTelefono(String telefono){
       this.telefono = telefono;
   }
   
}





y la clase "Cuenta":

Código (java) [Seleccionar]


package modeloBancario;

public abstract class Cuenta {
   
   protected int numeroDeCuenta;
   protected double saldo;
   protected Cliente titular;
   
   public Cuenta(){
       
       numeroDeCuenta = 0;
       saldo = 0;
       titular ();
       
   }

}


Agradeceria una pista, llevo dias atascado!

z3nth10n

Básicamente, lo que te pide es que crees un nuevo campo de tipo tal y con nombre cual:

Dentro de la clase Cuenta

Código (java) [Seleccionar]
public class Cuenta {

//....

public Client titular = new Client();

public Cuenta getTitutar() {

titular.idClient = <valor_tipo_int>;
titular.nombre = <valor_tipo_string>;
titular.direccion = <valor_tipo_string>;
titular.telefono = <valor_tipo_string>;

return titular;

}

}


public <Tipo> <nombre_de_campo>

public <Tipo> <nombre_de_metodo>();

Supongo que te pedirá algo así. :P

Interesados hablad por Discord.

men100

Al final lo deje asi, no se si estara bien:

Código (java) [Seleccionar]


package modeloBancario;

public abstract class Cuenta {
   
    protected int numeroDeCuenta;
    protected double saldo;
    protected Cliente titular;
   
    public Cuenta(){
       
        numeroDeCuenta = 0;
        saldo = 0;
        titular = null;
       
    }
   
    public Cuenta (int numeroDeCuent, double saldo, Cliente titular){
       
        this.numeroDeCuenta = numeroDeCuenta;
        this.saldo = saldo;
        this.titular = titular;
    }
   
    public int getNumeroDeCuenta(){
        return numeroDeCuenta;
    }
   
    public void setNumeroDeCuenta(int numeroDeCuenta){
        this.numeroDeCuenta = numeroDeCuenta;
    }
   
    public double getSaldo(){
        return saldo;
    }
   
    public void setSaldo (int saldo){
        this.saldo = saldo;
    }
   
    public Cliente getTitular(){
        return titular;
    }
   
    public void setTitular(Cliente titular){
        this.titular = titular;
    }




Imagino que luego podre crear objetos del tipo "Cliente". Lo que no entiendo es que valores pueden tener. Esta claro que int tendra un entero, un String letras...pero que valores puede tener la clase "Cliente"?

HardC0d3

#3
Citar
men100:
Imagino que luego podre crear objetos del tipo "Cliente".Lo que no entiendo es que valores pueden tener. Esta claro que int tendra un entero, un String letras...pero que valores puede tener la clase "Cliente"?

Pues tendrá los atributos//variables que tenga tu clase Cliente, en tu caso la clase Cliente tiene los atributos: idCliente, nombre, direccion y telefono:

Código (java) [Seleccionar]

public class Cliente{

   private int idCliente;
   private String nombre;
   private String direccion;
   private String telefono;

  ...


Esos valores los podrás modificar u obtener con los setters y los getters de un objeto de la clase Cliente:

Código (java) [Seleccionar]

   public void setIdCliente(int idCliente){
       this.idCliente = idCliente;
   }

   public String getNombre(){
       return nombre;
   }

  ...


men100

Cita de: HardC0d3 en 18 Enero 2018, 23:45 PM
Pues tendrá los atributos//variables que tenga tu clase Cliente, en tu caso la clase Cliente tiene los atributos: idCliente, nombre, direccion y telefono:

Código (java) [Seleccionar]

public class Cliente{

   private int idCliente;
   private String nombre;
   private String direccion;
   private String telefono;

  ...


Esos valores los podrás modificar u obtener con los setters y los getters de un objeto de la clase Cliente:

Código (java) [Seleccionar]

   public void setIdCliente(int idCliente){
       this.idCliente = idCliente;
   }

   public String getNombre(){
       return nombre;
   }

  ...



Gracias por la respuesta. Pero lo que dices, puede hacerse aun si no existiera la clase "Cuenta" (que es donde esta el atributo del tipo de clase "Cliente". Yo lo que digo es que trabajando con la clase "Cuenta":

Código (java) [Seleccionar]


package modeloBancario;

public abstract class Cuenta {

    protected int numeroDeCuenta;
    protected double saldo;
    protected Cliente titular;

    public Cuenta(){

        numeroDeCuenta = 0;
        saldo = 0;
        titular = null;

    }

    public Cuenta (int numeroDeCuent, double saldo, Cliente titular){

        this.numeroDeCuenta = numeroDeCuenta;
        this.saldo = saldo;
        this.titular = titular;



hago su constructor con parámetros:

Código (java) [Seleccionar]
public Cuenta (int numeroDeCuent, double saldo, Cliente titular){
       
        this.numeroDeCuenta = numeroDeCuenta;
        this.saldo = saldo;
        this.titular = titular;
    }


y...¿como se supone que creo un objeto del tipo titular? ¿Que parametos le doy?:

Código (java) [Seleccionar]


    public static void main(String[] args) {
       
        Cuenta libreta1 = new Cuenta(1,3000,¿¿¿???);
       



¿que pongo en las interrogaciones? se supone que titular, al ser de tipo de clase "Cliente", tiene 4 atributos. ¿Hay que poner los 4? ¿Alguno? ¿Que va ahi? Ya se que en los int van numeros, en los string letras...pero ahi,¿ que va?

rub'n

#5
ya va, un momento creo que te confundes cuando en realidad vas bien homie, bueno te creas una instancia de Tipo Cliente tal cual y debes iniciarlizar sus atributos o variables de instancia, como te lo mencionaron ya

Estas variables de instancia, instance field, campos, atributos, todo sinonimos , son un ejemplo de lo que puede tener este tipo de Cliente. aqui tiene 4, puede tener menos o mas eso depende de ti.

Código (java) [Seleccionar]

public class Cliente{

   private int idCliente;
   private String nombre;
   private String direccion;
   private String telefono;





Pero esto ? lo viste bien  :huh: estas intentando instanciar una clase abstracta, de una tu compilador deberia de quejarse ya que es ilegal, una clase abstracta nunca se instancia, eso le corresponde a las clases que las extiendan, desarrollar la logica de esa clase

Código (java) [Seleccionar]

Cuenta libreta1 = new Cuenta(1,3000,¿¿¿???);


actualizarSaldo, retirar estos metodos abstractos deben estar en la clase Cuenta y no los veo, también el metodo ingresar

Ejemplo
Código (java) [Seleccionar]

public abstract void actualizarSaldo();
public abstract void retirar();


Tengo que formatear una pc con windows  :xD , vengo dentro de un rato.





Salida estandar por consola para atajos

Código (java) [Seleccionar]

package modeloBancario;
public interface ShowData {
   static <T> void println(final T s) {
       System.out.println(s);
   }
}



Clase cuenta
Código (java) [Seleccionar]
package modeloBancario;

/*
Esta clase representa el concepte general de una Cuenta Bancaria basica
*/
public abstract class Cuenta {

   protected int numeroDeCuenta;
   protected double saldo;
   protected Cliente titular;

   public Cuenta() {
       this.numeroDeCuenta = 0;
       this.saldo = 0.0d;
       this.titular = null;
   }

   public Cuenta(int numeroDeCuenta, double saldo, Cliente titular) {
       this.numeroDeCuenta = numeroDeCuenta;
       this.saldo = saldo;
       this.titular = titular;
   }

   public int getNumeroDeCuenta() {
       return numeroDeCuenta;
   }

   public void setNumeroDeCuenta(int numeroDeCuenta) {
       this.numeroDeCuenta = numeroDeCuenta;
   }

   public double getSaldo() {
       return saldo;
   }

   public void setSaldo(double saldo) {
       this.saldo = saldo;
   }

   public Cliente getTitular() {
       return titular;
   }

   public void setTitular(Cliente titular) {
       this.titular = titular;
   }
   
   //ejemplo metodo ingresar XD
   public void ingresar(int ingreso) {
       this.saldo += ingreso;
   }
 
   /*
   Metodo abstracto que sera sobreescrito por las
   subClases concretas
    */
   public abstract void actualizarSaldo();
   
   public abstract void retirar();

  @Override
   public String toString() {
       return "Numero de Cuenta=" + numeroDeCuenta+"\n" +
               "Saldo= " + saldo+"\n" +
               titular.toString();//usando metodo toString de la clase Cliente, reusar codigo

   }
}




Clase cliente
Código (java) [Seleccionar]
package modeloBancario;

public class Cliente {

   private int idCliente;
   private String nombre;
   private String direccion;
   private String telefono;

   public Cliente (){
       this.idCliente = 0;
       this.nombre = "";
       this.direccion = "";
       this.telefono = "";
   }

   public Cliente (int idCliente, String nombre, String direccion, String telefono){

       this.idCliente = idCliente;
       this.nombre = nombre;
       this.direccion = direccion;
       this.telefono = telefono;

   }

   public int getIdCliente(){
       return idCliente;
   }

   public void setIdCliente(int idCliente){
       this.idCliente = idCliente;
   }

   public String getNombre(){
       return nombre;
   }

   public void setNombre(String nombre){
       this.nombre = nombre;
   }

   public String getDireccion(){
       return direccion;
   }

   public void setDireccion(String direccion){
       this.direccion = direccion;
   }

   public String getTelefono(){
       return telefono;
   }

   public void setTelefono(String telefono){
       this.telefono = telefono;
   }

    @Override
   public String toString() {
       return "idCliente= " + idCliente +"\n"+
               "Nombre= " + nombre +"\n"+
               "Direccion= " + direccion  +"\n"+
               "Telefono= " + telefono ;
   }
}



Clase TestExec es de ejemplo para que veas como se puede hacer, una de las tantas maneras de pasar ese parametro Cliente, aqui a través del metodo set linea 43

Código (java) [Seleccionar]

package modeloBancario;
import javax.swing.*;

public class TestExec extends Cuenta {


   private static JTextArea data = new JTextArea();

   public TestExec() {

   }

   @Override
   public void actualizarSaldo() {
       setSaldo(1000);
        //heredamos el metodo setSaldo y lo usamos para setear el saldo del cliente
       //de igual manera sobrescribimos el metodo Actualizar Saldo
       // haciendo que esta clase TestExec sea una clase concreta
   }

   @Override
   public String toString() {
       //invocamos al metodo toString de la superClase abstracta Cuenta con super
       //para la reutilizacion de codigo
       return super.toString();
   }

   public static void main(String ...PoC) throws ClassNotFoundException, UnsupportedLookAndFeelException, InstantiationException, IllegalAccessException {
       //dando el look por defecto del S0
       UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

       //Instanciando al cliente
       Cliente clienteTitular = new Cliente(1, "men100", "barrio la Muerte", "+58000SinCorriente");

       //Instancia de clase TestExec constructor sin parametros
       //tambien se pude invocar el constructor de la super clase y pasar parametros
       TestExec test = new TestExec();
       test.setNumeroDeCuenta(1241345145);

       //invocando metodo sobreEscrito
       test.actualizarSaldo();

       test.setTitular(clienteTitular); // seteamos la instancia clienteTitular por el setter, mas abajo otra manera.

       //Salida estandar de la instancia TestExec
       ShowData.println(test.toString());

       //Seteamos la instancia TestExec al JTextArea
       data.setText(test.toString());
       data.setEditable(false);
       //Imprimiendo la data con una notificacion al usuario
       JOptionPane.showMessageDialog(null,data,"Informacion cuenta Cliente",1);
   }

}



Output

Código (java) [Seleccionar]

/opt/jdk1.8.0_92/bin/j...
Numero de Cuenta=1241345145
Saldo= 1000.0
idCliente= 1
Nombre= men100
Direccion= barrio la Muerte
Telefono= +58000SinCorriente

Process finished with exit code 0




Aqui te muestro otra version de la clase TestExec la instancia de tipo Cliente la seteamos a través del constructor


  • Usando el constructor de la superClase invocandolo con super para reusar mas el source ver linea 10 a 13.
  • Incluido metodo retirar


Código (java) [Seleccionar]

package testing.foro.modeloBancario;


import util.ShowData;
import javax.swing.*;

public class TestExec extends Cuenta {

   private static JTextArea data = new JTextArea();
   private static Double saldoRetirado;
   private static Double saldoIngresado;

   public TestExec(int numeroDeCuenta, double saldo, Cliente titular, Double saldoRetirado) {
       super(numeroDeCuenta, saldo, titular);//invocando el constructor de la superClase
       this.saldoRetirado = saldoRetirado;
   }


   @Override
   public void actualizarSaldo() {
        //de igual manera sobrescribimos el metodo Actualizar Saldo
       // haciendo que esta clase TestExec sea una clase concreta
       ShowData.println("Saldo actual : "+super.getSaldo());
   }

   @Override
   public void retirar() {
       if(super.getSaldo() > 0) {
           final double egreso = (double) getSaldo() - saldoRetirado;
           super.setSaldo(egreso);
           ShowData.println("Saldo retirado: "+saldoRetirado);
       }else {
           ShowData.println("Saldo retirado: "+saldoRetirado);
           JOptionPane.showMessageDialog(null,"No hay saldo disponible");
       }
   }

   @Override
   public String toString() {
       //invocamos al metodo toString de la superClase abstracta Cuenta con super
       //para la reutilizacion de codigo
       return super.toString();
   }

   public static void main(String ...PoC) throws ClassNotFoundException, UnsupportedLookAndFeelException, InstantiationException, IllegalAccessException {
       //dando el look por defecto del S0
       UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

       //Instanciando al cliente
       Cliente clienteTitular = new Cliente(1, "men100", "barrio la Muerte", "+58000SinCorriente");


       //ingresamos el saldo y validamos el input
       final String in = JOptionPane.showInputDialog("Ingresar saldo");
       saldoIngresado = Double.valueOf(in);

       //retiramos saldo y validamos el input
       final String out = JOptionPane.showInputDialog("Cuanto desea retirar ? ");
       saldoRetirado = Double.valueOf(out);


       //Instanciando el constructor con parametros e ivocando al de la super clase ver linea 12
       TestExec test = new TestExec(1241345145, 0.0, clienteTitular, saldoRetirado);
       test.setSaldo(saldoIngresado);
       ShowData.println("Saldo ingresado "+saldoIngresado);

       test.retirar();
       test.actualizarSaldo();
       //Salida estandar del instancia TestExec

       //mostrar salida estandar
       Mostrar.println(test.toString());

       final StringBuilder sb = new StringBuilder();
       sb.append("Saldo ingresado: "+saldoIngresado+"\n");
       sb.append("Saldo retirado: "+ saldoRetirado +"\n");

       //Setemos el instancia TestExec al JTextArea
       data.setText(sb.toString()+test.toString());
       data.setEditable(false);
       //Imprimiendo la data con una notificacion al usuario
       JOptionPane.showMessageDialog(null,data,"Informacion cuenta Cliente",1);
   }

}



y te pasas por aqui  :D

https://foro.elhacker.net/java/manuales_de_java-t162966.30.html


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

HardC0d3

#6
Citar
men100 :
¿que pongo en las interrogaciones? se supone que titular, al ser de tipo de clase "Cliente", tiene 4 atributos. ¿Hay que poner los 4? ¿Alguno? ¿Que va ahi? Ya se que en los int van numeros, en los string letras...pero ahi,¿ que va?

Al crear un objeto de tipo Cuenta tienes que ponerle los parámetros que el constructor de la clase Cuenta espera que le pases. Tu clase Cuenta espera un entero, un double y un OBJETO de tipo Cliente, así pues:

Código (java) [Seleccionar]

public static void main(String[] args) {

       Cuenta libreta1 = new Cuenta(1, 3000, ????);


El parámetro "????" debe ser un objeto Cliente. ¿Como creas un objeto Cliente? Pues lo puedes crear así:
Código (java) [Seleccionar]

// Creas un objeto Cliente
Cliente titular = new Cliente(22, "Pepe", "Calle Falsa", "963232323"); // int, String, String, String.

// Creas un objeto Cuenta al que le pasas por parametro un entero, un double y el objeto Cliente ya creado.
Cuenta libreta1 = new Cuenta(1, 3000, titular); // int, double, Cliente.


O puedes meterle el objeto Cliente directamente (queda mas guarro):
Código (java) [Seleccionar]


Cuenta libreta1 = new Cuenta(1, 3000, new Cliente(22, "Pepe", "Calle Falsa", "963232323"));



PD1: Lo que te comenta el compañero rub'n, si usas una clase Abstracta deberás implementar, por lo menos, un método abstracto. Esa clase Abstracta no podrá  ser instanciada ( = new Blablabla...)

PD2: Lo que no entiendo es por qué la clase Cuenta tiene que ser abstracta, no me cuadra, porque para ello Cliente debe heredar de Cuenta, y no es lógico (un Cliente no es Cuenta  :¬¬ )

Saludos.

rub'n

Cita de: HardC0d3 en 19 Enero 2018, 22:12 PM

PD2: Lo que no entiendo es por qué la clase Cuenta tiene que ser abstracta, no me cuadra, porque para ello Cliente debe heredar de Cuenta, y no es lógico (un Cliente no es Cuenta  :¬¬ )

Saludos.


Pero eso es de ejemplo homie, seguro el enunciado a penas esta completo,  :xD y seguro que en ese enunciado deberan mostrar cuales seran las clases hijas o concretas tanto para la clase Cuenta como para la clase Cliente para heredar sus atributos.


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

men100

Gracias por las respuestas chicos, ya me queda más claro. Estoy empezando y hay cosas que aun no he dado, pero revisare este hilo cuando avance en la materia.

Efectivamente, el enunciado esta imcompleto y por eso faltan las clases hijas jeje. La duda que tenia era lo del atributo tipo objeto. Intenté hacerlo así:

Código (java) [Seleccionar]
Cuenta libreta1 = new Cuenta(1, 3000, new Cliente(22, "Pepe", "Calle Falsa", "963232323"));

pero daba error, seguramente no habia puesto lo de "new Cliente" antes de los parámetros.

pero ahora casi todo claro!