CLR: .Net / Mono / Boo / Otros CLR > C#
Error al declarar una clase...
ProfesorX:
Bueno, en el nuevo codigo que publicaste no has hecho las correcciones que te dije. Debiste hacerlo, pero bueno :rolleyes:
Te dejo el codigo corregido de nuevo, con las correcciones que te mencione anteriormente, ademas de nuevas correcciones con comentarios para que sepas el porque de tu error, espero que lo comprendas mejor.
--- Código: C# --- using System;using System.Collections.Generic; class datos{ public string[] vec; public datos() { vec = new String[7]; }} class Clientes{ // Debes declarar la variable como static, para poder // acceder a ella en metodos static static datos _datos; public static void detalle() { for (byte a = 1; a < 50; a++) { Console.SetCursorPosition(a, 00); Console.Write("="); Console.SetCursorPosition(a, 02); Console.Write("="); } Console.SetCursorPosition(17, 01); Console.Write(" Alta de Clientes "); Console.SetCursorPosition(01, 04); Console.Write(" Nombre completo....:"); Console.SetCursorPosition(01, 05); Console.Write(" Dirección..........:"); Console.SetCursorPosition(01, 06); Console.Write(" Cód. postal........:"); Console.SetCursorPosition(01, 07); Console.Write(" Ciudad.............:"); Console.SetCursorPosition(01, 08); Console.Write(" Celular............:"); Console.SetCursorPosition(01, 09); Console.Write(" Crédito............:"); Console.SetCursorPosition(01, 10); Console.Write(" Plazo en días......:"); } public static void ingreso() { string linea = ""; for (int cont = 0; cont < 7; cont++) { do { Console.SetCursorPosition(22, cont + 4); linea = Console.ReadLine(); } while ((linea == null) || (linea.Length == 0)); _datos.vec[cont] = linea; } } public static void Main(string[] args) { Console.Title = " Alta de Clientes"; // Creas un nuevo objeto de tipo "datos" _datos = new datos(); detalle(); ingreso(); // Esto es incorrecto para lo que creo que quieres hacer. // Cada vez que usas new creas un nuevo objeto. // por lo tanto, el nuevo objeto d_atos, no es el mismo // que _datos, son del mismo tipo, pero NO son el mismo // objeto, cada objeto es independiente uno del otro, // por lo tanto no puedes esperar que d_atos contenga lo // que capturaste en _datos, para obtener lo que capturaste // en _datos, debes declarar _datos como static al // principio de la clase para poder acceder a el desde los // metodos static (Lo que ya hice en esta ejemplo corregido). // Si los metodos no fueran static, no seria // necesario declarar _datos como static, pero entonces // necesitarias crear una instancia (objeto) de // la clase clientes para acceder a los metodos no estaticos // detalle() e ingreso(). No se si me entiendas. //datos d_atos = new datos(); Console.SetCursorPosition(01,12); Console.WriteLine(" Nombre...:" + _datos.vec[0]); Console.ReadKey(); }}
Saludos :)
LenguajeC:
Hola Profe.
Me pudrías decir que criterio debo utilizar para saber cuando utilizar las propiedades en c#,
me parecía que era una manera avanzada de programar y me encuentro que en el código anterior la terminaste descartando, te pido x favor que me lo expliques para saber a que atenerme.-
Un gran abrazo.-
Daniel
ProfesorX:
--- Cita de: "LenguajeC" ---Me pudrías decir que criterio debo utilizar para saber cuando utilizar las propiedades en c#,
--- Fin de la cita ---
En realidad es un poco a gusto del programador, y segun lo necesite el programa. cada programa es diferente.
Segun el paradigma de la programacion orientada a objetos, no es bueno tener acceso directo a las variables internas de una clase, para evitar efectos secundarios inesperados, todo acceso debe ser por medio de metodos set/get, parametros y mensajes.
Yo en la practica solo utilizo set y get cuando necesito que la variable sea solo de lectura o solo de escritura. O sea que si necesito leer la variable, pero no escribirla, utilizo get, y omito el get, y si necesito escribir la variable, pero no leerla, utilizo set y omito el get. Si necesito leer y escribir la variable, la hago public directamente. Aun asi, no debes abusar de ello, en lo posible debes tratar de que cada objeto sea independiente del exterior, y evitar las variables public en lo posible. Solo cuando sea de veras necesario
De hecho, tu programa no esta correctamente encapsulado, ya que llamas por fuera a variables de tu clase, y manipulas la clase con metodos externos, lo mas correcto hubiera sido definir los metodos dentro de la misma clase datos, para manipular la variable vec dentro de la clase y evitar manipulacion externa de la clase.
Te dejo un ejemplo de como lo hubiera hecho, eso te lo aclarara un poco mas. Nota como manejo el vector internamente dentro de la clase datos, y no necesito acceder al vector dentro de main(), si esta correctamente encapsulado ;)
--- Código: C# --- using System;using System.Collections.Generic; class datos{ private string[] vec; public datos() { vec = new String[7]; } public void detalle() { for (byte a = 1; a < 50; a++) { Console.SetCursorPosition(a, 00); Console.Write("="); Console.SetCursorPosition(a, 02); Console.Write("="); } Console.SetCursorPosition(17, 01); Console.Write(" Alta de Clientes "); Console.SetCursorPosition(01, 04); Console.Write(" Nombre completo....:"); Console.SetCursorPosition(01, 05); Console.Write(" Dirección..........:"); Console.SetCursorPosition(01, 06); Console.Write(" Cód. postal........:"); Console.SetCursorPosition(01, 07); Console.Write(" Ciudad.............:"); Console.SetCursorPosition(01, 08); Console.Write(" Celular............:"); Console.SetCursorPosition(01, 09); Console.Write(" Crédito............:"); Console.SetCursorPosition(01, 10); Console.Write(" Plazo en días......:"); } public void ingreso() { string linea = ""; for (int cont = 0; cont < vec.Length ; cont++) { do { Console.SetCursorPosition(22, cont + 4); linea = Console.ReadLine(); } while ((linea == null) || (linea.Length == 0)); vec[cont] = linea; } } public void imprime() { Console.SetCursorPosition(01, 12); Console.WriteLine("Nombre...:" + vec[0]); Console.ReadKey(); }} class Clientes{ static datos _datos; public static void Main(string[] args) { Console.Title = " Alta de Clientes"; _datos = new datos(); _datos.detalle(); _datos.ingreso(); _datos.imprime(); }}
Saludos :)
LenguajeC:
Hola profe.
Muchas gracias y tendré que combinar más la práctica con la teoría.-
Saludos.
Daniel
Navegación
[*] Página Anterior
Ir a la versión completa