Principales respuestas
Trabajar con clase que tiene como propiedad un array (colaboración entre clases)

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); } } }
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
Pedro Ávila
"El hombre sabio querrá estar siempre con quien sea mejor que él."
Lima - Perú- Propuesto como respuesta Jorge TurradoMVP lunes, 12 de junio de 2017 5:36
- Marcado como respuesta Joyce_ACModerator martes, 13 de junio de 2017 18:31
-
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.- Propuesto como respuesta Jorge TurradoMVP lunes, 12 de junio de 2017 5:36
- Marcado como respuesta Joyce_ACModerator martes, 13 de junio de 2017 18:31
-
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- Marcado como respuesta Joyce_ACModerator martes, 13 de junio de 2017 18:31
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. -
-
-
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ú -
-
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.- Propuesto como respuesta Jorge TurradoMVP lunes, 12 de junio de 2017 5:36
- Marcado como respuesta Joyce_ACModerator martes, 13 de junio de 2017 18:31
-
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
Pedro Ávila
"El hombre sabio querrá estar siempre con quien sea mejor que él."
Lima - Perú- Propuesto como respuesta Jorge TurradoMVP lunes, 12 de junio de 2017 5:36
- Marcado como respuesta Joyce_ACModerator martes, 13 de junio de 2017 18:31
-
-
-
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- Marcado como respuesta Joyce_ACModerator martes, 13 de junio de 2017 18:31