none
Trabajar con clase que tiene como propiedad un array (colaboración entre clases) RRS feed

  • Pregunta

  • Hola, soy nuevo en C# y estoy probando colaboración entre clases. Realice con éxito una aplicación de consola con dos clases: La clase Banco y la clase Cliente.

    En Banco creo tres instancias de cliente y todo me funciona genial. Ahora bien, quiero hacer lo mismo, pero en la clase cliente quiero tener una propiedad que sea un array de tipo string que guarde nombres. En este momento tengo dos propiedades, Nombre y Monto. Si comprendo cómo lograr trabajar con el nombre, luego voy hacer dos array y espero trabajarlos en paralelo. En fin, preciso de vuestra ayuda con un ejemplo, aclaro, no quiero resolverlo por medio de listas, quiero trabajarlo con arrays.

    Dejo el código de mi ejemplo actual y quedo a la espera de la ayuda, desde ya gracias.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Test
    {
        class Banco
        {
           
            private Cliente cliente1, cliente2, cliente3;
            public Banco()
            {
                cliente1 = new Cliente();
                Console.WriteLine ("Ingrese el nombre del cliente 1:");
                cliente1.Nombre =Console.ReadLine ();
                Console.WriteLine("Ingrese el monto del cliente 1:");
                cliente1.Monto = int.Parse(Console.ReadLine());
                cliente2 = new Cliente();
                Console.WriteLine("Ingrese el nombre del cliente 2:");
                cliente2.Nombre = Console.ReadLine();
                Console.WriteLine("Ingrese el monto del cliente 2:");
                cliente2.Monto = int.Parse(Console.ReadLine());
                cliente3 = new Cliente();
                Console.WriteLine("Ingrese el nombre del cliente 3:");
                cliente3.Nombre = Console.ReadLine();
                Console.WriteLine("Ingrese el monto del cliente 1:");
                cliente3.Monto = int.Parse(Console.ReadLine());
            }
            public void Operar()
            {
                cliente1.Monto = cliente1.Monto + 100;
                cliente2.Monto = cliente2.Monto + 150;
                cliente3.Monto = cliente3.Monto + 200;
            }
            public void DepositosTotales()
            {
                int t = cliente1.Monto + cliente2.Monto + cliente3.Monto;
                Console.WriteLine("El total de dinero en el banco es:" + t);
                cliente1.Imprimir();
                cliente2.Imprimir();
                cliente3.Imprimir();
            }
            static void Main(string[] args)
            {
                Banco banco1 = new Banco();
                banco1.Operar();
                banco1.DepositosTotales();
                Console.ReadKey();
            }
        }
    }
    
    

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Test
    {
        
            class Cliente
            {
                private string nombre;
                private int monto;
                public string Nombre
                {
                    set
                    {
                        nombre = value;
                    }
                    get
                    {
                        return nombre;
                    }
                }
                public int Monto
                {
                    set
                    {
                        monto = value;
                    }
                    get
                    {
                        return monto;
                    }
                }
                public void Imprimir()
                {
                    Console.WriteLine(Nombre + " tiene depositado la suma de " + Monto);
                }
            }
        }

    sábado, 10 de junio de 2017 22:32

Respuestas

  • Hola @-Kestrel-

    Estas equivocado si pretendes trabajar usando POO como estas pensando, tus entidades de negocio se representan 


    La implementación:

    Cliente

    public class Cliente
        {
            public int ClienteId { get; set; }
            public string Nombre { get; set; }
        }


    Banco

    public class Banco
        {
            public int BancoId { get; set; }
            public int ClienteId { get; set; }
            public decimal Monto { get; set; }
    
            public virtual Cliente Cliente { get; set; }
            public virtual ICollection<Cliente> Clientes { get; set; }
        }
     

    Te dejo unos link

    Introduction to Object Oriented Programming Concepts (OOP) and More

    Fundamentos de la POO


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    domingo, 11 de junio de 2017 23:49
  • Es que no es la manera de relacionar las clases, según el contexto las relaciones pueden darse por agregación, composición, generalización, dependencia, etc. Por ejemplo, considera dos clases: Titular y Cuenta Corriente, un titular puede aperturar varias cuentas corrientes y por cada cuenta puede realizar operaciones de depósito o retiro, ambas clases definen una relación de asociación con multiplicidad de 1 a varios.

    - Clases

    public enum TipoOperacion
    {
    	Deposito, Retiro
    }
    
    public class Titular
    {
    	public Titular(string Nombre)
    	{
    		this.Nombre = Nombre;
    	}
    
    	public string Nombre { get; set; }
    	public List<CuentaCorriente> CuentasTitular { get; set; }
    }
    
    public class CuentaCorriente
    {
    	public CuentaCorriente(Titular Titular, int NumeroCuenta, decimal MontoApertura)
    	{
    		this.Titular = Titular;
    		this.NumeroCuenta = NumeroCuenta;
    		this.Saldo = MontoApertura;
    	}
    
    	private decimal Saldo;
    
    	public int NumeroCuenta { get; set; }
    	public Titular Titular { get; set; }
    	public decimal SaldoDisponible { get { return Saldo; }}        
    
    	public void Operacion(TipoOperacion Operacion, decimal Monto)
    	{
    		Saldo +=  Operacion == TipoOperacion.Deposito ? Monto : -Monto;
    	}
    }

    - Ejemplo

    static void Main(string[] args)
    {
    	//Crear una instancia de la clase Titular
    	var titular = new Titular("Titular A");
    
    	//Crear cuentas corrientes para la instancia del titular
    	titular.CuentasTitular = new List<CuentaCorriente>()
    	{
    		new CuentaCorriente(titular, 1001, 1000),
    		new CuentaCorriente(titular, 1002, 5000)
    	};
    
    	//Realizar operaciones con las cuentas
    	titular.CuentasTitular.FirstOrDefault(c => c.NumeroCuenta == 1001)
    		.Operacion(TipoOperacion.Deposito, 500);
    	
    	var cuenta = titular.CuentasTitular.FirstOrDefault(c => c.NumeroCuenta == 1002);
    	cuenta.Operacion(TipoOperacion.Deposito, 1000);
    	cuenta.Operacion(TipoOperacion.Retiro, 500);            
    
    	//Mostrar saldo disponible por cuenta del títular
    	foreach (var item in titular.CuentasTitular)
    	{
    		Console.WriteLine("Saldo disponible de cuenta {0}: {1}", 
    					item.NumeroCuenta, item.SaldoDisponible);
    	}
    	Console.WriteLine();
    
    	//Mostrar el total -en todas las cuentas- del títular
    	Console.WriteLine("Saldo total {0}", titular.CuentasTitular.Sum(x => x.SaldoDisponible));
    
    	Console.ReadKey();
    }
    


    - Salida

    ¿Qué quieres hacer lo mismo para varios titulares?, entonces crea una instancia de tipo List<Titular>.



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 11 de junio de 2017 23:42
  • hola

    >>pero en la clase cliente quiero tener una propiedad que sea un array de tipo string que guarde nombres.

    la primer recomendacion es que no uses array usa listas, del estilo List<Cliente>

    ademas porque un array de string con nombre si puede definir la lista de clases

    public class Cliente{
    
        public string Nombre {get;set;}
    
        public int Monto {get;set;}
    
    }

    entonces luego harias

    class Banco
    {
       
    	private List<Cliente> clientes = null;
    	
    	public Banco()
    	{
    		clientes = List<Cliente>();
    		
    		for(int i=1; i<=3;i++)
    		{
    			Cliente cli = new Cliente();
    			Console.WriteLine ("Ingrese el nombre del cliente {0}:", i);
    			cli.Nombre = Console.ReadLine );
    			Console.WriteLine("Ingrese el monto del cliente {0}:", i);
    			cli.Monto = int.Parse(Console.ReadLine());
    			
    			clientes.Add(cli);
    		}
    		
    	}

    como eras con las listas el codigo se simplifica

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 12 de junio de 2017 14:16

Todas las respuestas

  • Creo que no vas teniendo un buen inicio en POO, las clases que mencionas deben relacionarse entre sí mediante asociación. Sí deseas que una instancia de la clase Banco contenga mas de una instancia de la clase 'Cliente' no basta con tener una propiedad basada en un array de tipo string que contenga el nombre del cliente porque entonces ¿cuál es el sentido de la clase 'Cliente'?, la propiedad debe representar la relación de asociación entre la clase 'Cliente' y 'Banco', quizá algún método como AgregarCliente() que vaya creando "n" instancias de la clase 'Cliente' sobre una instancia de la clase 'Banco'. De igual manera, pienso que deberías tener una clase llamada MovimientosCuenta para representar los movimientos en una cuenta la misma que debe relacionarse con la clase 'Cliente' y 'Banco'.  


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 11 de junio de 2017 0:16
  • Gracias, lo voy a probar.
    domingo, 11 de junio de 2017 5:46
  • El código que pase funciona y la idea es simplemente probar la colaboración entre clases, pero ahora con un array, solo eso.

    Te agradezco tu respuesta, y si tenes un ejemplo con el cual me ilustres te lo agradezco

    Saludos.

    domingo, 11 de junio de 2017 5:49
  • Hola @-Kestrel-

    Este enlace puede ayudar Colaboración de clases


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    domingo, 11 de junio de 2017 22:37
  • Es lo mismo que ya tengo hecho.

    LLo que yo busco es hacer en la clase cliente una propiedad que sea un array de tipo string para guardar los nombres.

    ¿Alguna idea?

    domingo, 11 de junio de 2017 23:02
  • Es que no es la manera de relacionar las clases, según el contexto las relaciones pueden darse por agregación, composición, generalización, dependencia, etc. Por ejemplo, considera dos clases: Titular y Cuenta Corriente, un titular puede aperturar varias cuentas corrientes y por cada cuenta puede realizar operaciones de depósito o retiro, ambas clases definen una relación de asociación con multiplicidad de 1 a varios.

    - Clases

    public enum TipoOperacion
    {
    	Deposito, Retiro
    }
    
    public class Titular
    {
    	public Titular(string Nombre)
    	{
    		this.Nombre = Nombre;
    	}
    
    	public string Nombre { get; set; }
    	public List<CuentaCorriente> CuentasTitular { get; set; }
    }
    
    public class CuentaCorriente
    {
    	public CuentaCorriente(Titular Titular, int NumeroCuenta, decimal MontoApertura)
    	{
    		this.Titular = Titular;
    		this.NumeroCuenta = NumeroCuenta;
    		this.Saldo = MontoApertura;
    	}
    
    	private decimal Saldo;
    
    	public int NumeroCuenta { get; set; }
    	public Titular Titular { get; set; }
    	public decimal SaldoDisponible { get { return Saldo; }}        
    
    	public void Operacion(TipoOperacion Operacion, decimal Monto)
    	{
    		Saldo +=  Operacion == TipoOperacion.Deposito ? Monto : -Monto;
    	}
    }

    - Ejemplo

    static void Main(string[] args)
    {
    	//Crear una instancia de la clase Titular
    	var titular = new Titular("Titular A");
    
    	//Crear cuentas corrientes para la instancia del titular
    	titular.CuentasTitular = new List<CuentaCorriente>()
    	{
    		new CuentaCorriente(titular, 1001, 1000),
    		new CuentaCorriente(titular, 1002, 5000)
    	};
    
    	//Realizar operaciones con las cuentas
    	titular.CuentasTitular.FirstOrDefault(c => c.NumeroCuenta == 1001)
    		.Operacion(TipoOperacion.Deposito, 500);
    	
    	var cuenta = titular.CuentasTitular.FirstOrDefault(c => c.NumeroCuenta == 1002);
    	cuenta.Operacion(TipoOperacion.Deposito, 1000);
    	cuenta.Operacion(TipoOperacion.Retiro, 500);            
    
    	//Mostrar saldo disponible por cuenta del títular
    	foreach (var item in titular.CuentasTitular)
    	{
    		Console.WriteLine("Saldo disponible de cuenta {0}: {1}", 
    					item.NumeroCuenta, item.SaldoDisponible);
    	}
    	Console.WriteLine();
    
    	//Mostrar el total -en todas las cuentas- del títular
    	Console.WriteLine("Saldo total {0}", titular.CuentasTitular.Sum(x => x.SaldoDisponible));
    
    	Console.ReadKey();
    }
    


    - Salida

    ¿Qué quieres hacer lo mismo para varios titulares?, entonces crea una instancia de tipo List<Titular>.



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 11 de junio de 2017 23:42
  • Hola @-Kestrel-

    Estas equivocado si pretendes trabajar usando POO como estas pensando, tus entidades de negocio se representan 


    La implementación:

    Cliente

    public class Cliente
        {
            public int ClienteId { get; set; }
            public string Nombre { get; set; }
        }


    Banco

    public class Banco
        {
            public int BancoId { get; set; }
            public int ClienteId { get; set; }
            public decimal Monto { get; set; }
    
            public virtual Cliente Cliente { get; set; }
            public virtual ICollection<Cliente> Clientes { get; set; }
        }
     

    Te dejo unos link

    Introduction to Object Oriented Programming Concepts (OOP) and More

    Fundamentos de la POO


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    domingo, 11 de junio de 2017 23:49
  • Comprendo, no es que vaya a trabajar en nada de esa manera.

    Solo quiero ver como tener una propiedad en una clase que sea un array y usarla desde la otra.

    Es solo eso.

    lunes, 12 de junio de 2017 3:19
  • No voy a trabajar así, solo quiero ver como decía antes, como usar un array como propiedad y cargarlo en la otra clase.

    Pero no es para usar en nada, solo conocer la forma de escribirlo.

    lunes, 12 de junio de 2017 3:22
  • hola

    >>pero en la clase cliente quiero tener una propiedad que sea un array de tipo string que guarde nombres.

    la primer recomendacion es que no uses array usa listas, del estilo List<Cliente>

    ademas porque un array de string con nombre si puede definir la lista de clases

    public class Cliente{
    
        public string Nombre {get;set;}
    
        public int Monto {get;set;}
    
    }

    entonces luego harias

    class Banco
    {
       
    	private List<Cliente> clientes = null;
    	
    	public Banco()
    	{
    		clientes = List<Cliente>();
    		
    		for(int i=1; i<=3;i++)
    		{
    			Cliente cli = new Cliente();
    			Console.WriteLine ("Ingrese el nombre del cliente {0}:", i);
    			cli.Nombre = Console.ReadLine );
    			Console.WriteLine("Ingrese el monto del cliente {0}:", i);
    			cli.Monto = int.Parse(Console.ReadLine());
    			
    			clientes.Add(cli);
    		}
    		
    	}

    como eras con las listas el codigo se simplifica

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 12 de junio de 2017 14:16