Al principio me confundí un poco con este tema pero, al ver los tres videos y repasar un poco los ejemplos, ahora me siento bastante seguro. ¡Muchas gracias por tu esfuerzo y un saludo desde Nuevo León, México!
Lo que tu tan facilmente enseñas con ese talento que tienes, los libros no lo hacen, este tipo de videos nos ayudan ya que de tu propia experiencia si existen casos donde uno tenga que hacer modificaciones al codigo tu lo explicas, eso no lo haria nadie a quien no le apasione algo como la programacion, por eso ademas de ser un excelente maestro, nos enseñas segun tu experiencia propia. Gracias
Entendí el tema a la perfección, no había escuchado hablar de los genéricos antes, una increíble herramienta. Con mucho ánimo de terminar un curso más con usted, Profe 💪 Muchas gracias!
Hola Juan, me gradué en una carrera administrativa, aunque actualmente trabajo con proyectos informáticos, y tengo bastante noción, por lo que estoy aprendiendo a desarrollar con tu curso. Muchas gracias por tu aporte.
Yo ya había visto en c++ las templates, es decir, funciones o procedimientos que tanto el parámetro devuelto como el argumento eran de tipo genérico y usaban también la notación , siendo T una convención, porque podrá ser G o guachimolli, por dedir cualquier cosa. No sé si en c# se puede hacer, y es que aún no e visto este capítulo; sólo 5 segundos.
Saludos Juan... muchos te felicitan por tu enorme explicación. Eres como el predicador das todo sin pedir nada a cambio.. Dios te bendiga grandemente...
Algo curioso es que puedes combinar programación genérica con el polimorfismo o asignación polimórfica. con eso puedes tener objetos de tipo Director, Electricista y Secretaria en la clase AlmacenEmpleados, esto hace que el código sea más legible y sea más facil la escalabilidad de tu programa, algo así: using System; namespace Genericos { class Program { static void Main(string[] args) { AlmacenEmpleados empleados = new AlmacenEmpleados (5); empleados.Agregar(new Director(1000)); empleados.Agregar(new Director(1500)); empleados.Agregar(new Director(2000)); empleados.Agregar(new Electricista(2500)); empleados.Agregar(new Secretaria(3000)); //empleados.Agregar(new Estudiante(2500)); //no deja agregar al estudiante porque no hereda o implementa a IEmpleado IEmpleados [] array = empleados.Array; foreach (var empleado in array) { Console.WriteLine(empleado.GetSalario());
} } } class AlmacenEmpleados where T : IEmpleados //restriccion solo para los que tienen salario { private int i = 0; private T[] array; public AlmacenEmpleados(int z) {
Array= new T[z];
} public int I { get => i; set => i = value; } public T[] Array { get => array; set => array = value; } public void Agregar(T empleado) { Array[I]= empleado; I++;
} public T GetEmpleado(int i) => Array[i]; }
} interface IEmpleados { double GetSalario(); } class Estudiante { private double edad; public Estudiante(double edad) { this.Edad = edad; } public double Edad { get => edad; set => edad = value; } } class Director : IEmpleados { private double salario; public Director(double salario) {
this.salario = salario;
} public double GetSalario() => this.salario; } class Secretaria : IEmpleados { private double salario; public Secretaria(double salario) { this.salario = salario; } public double GetSalario() => this.salario; } class Electricista : IEmpleados { private double salario; public Electricista(double salario) { this.salario = salario; } public double GetSalario() => this.salario; }
De este modo se puede almacenar dentro de una clase generica, objetos de diferente clase. Eso esta genial. Lo que veo dificil es despues volverlos a extraer para consultar sus atributos (salario), ya que habria que hacer un casting y no sabes de que clase es el elemento almacenado. ¿Alguna sugerencia?
hola amigo, tu si sabes de que clase estas almacenando, al momento de instanciar la clase generica, tu debes pasarle que tipo de objeto recibira, ahi sabes pues que tienes.
profesor buenas noches, saludos desde colombia. profesor estas clases genericas se declaran muy parecido a las list que diferencia hay entre estos dos. gracias
Hola Juan! Que tal? Estoy re-aprendiendo C# con tus videos sobre ese lengüaje y me esta ayudando mucho. Muchas gracias crack por todo el contenido que nos das para todos! Quería hacerte una consulta, tenes pensado hacer unos tutoriales sobre Unity o Godot ? Muchas gracias, Saludos desde Argentina de Buenos Aires!!
Aprender al mismo tiempo c# y Python 3 al mismo tiempo es un poco confuso a lo primero pero se puede, ¿que diferencias en pocas palabras separan a estos lenguajes? Saludos tus tutoriales se comprenden muy bien sigue sí que está bárbaro esta manera de aprender
¿Pudiste aprender ambos lenguajes a la vez? Yo traté de hacer lo mismo pero me era difícil ya que mezclaba los conceptos de los lenguajes y tuve que dejar Python para después.
hola recien empiezo con el curso y me surge una duda aqui, para aprovechar codigo pudiera haber hecho mi clase generica con el constructor salario y el metodo getsalario y solo poner que hereden de ella??
Buenas tengo una duda, ¿es necesario que la clase en cuestión implemente explícitamente la interfaz o basta con que cumpla los requisitos de la misma? Es decir que si por ejemplo el estudiante tuviese un método de nombre getSalario() pero su clase no llevara la interfaz : IParaEmpleados podría ser tratada por la clase genérica.
Llego tarde pero por si alguien tiene la misma pregunta y ve este video ahora, eso no es posible. Debes si o si implementar la interfaz de IParaEmpleados, si no lo implementas en la clase Estudiante y dentro de su bloque creas el método con el mismo nombre, con mismo tipo de parámetros y tipo de dato del método (o sea, un método exactamente igual que la interfaz "IParaEmpleados") C# va a tomar como que ese método creado no tiene nada que ver con la interfaz, si no que, es un método creado de la clase estudiante y no implementado de la interfaz, por lo tanto, no es posible usarlo en la clase genérica. La forma para que pueda suceder, es que implementes la interfaz explícitamente: "IParaEmpleados". a la hora de declarar la clase Estudiante ya que, de esa manera ahí si estarías implementando la interfaz y estar obligado a crear el método, y será posible utilizarlo en la clase genérica ya que, la restricción de la clase genérica era que solo podía utilizarse con tipos que implementen la interfaz "IParaEmpleados"
Esa restricción funcionaría si en vez de utilizar una interfaz lo hago con clases que hereden de otra? en este caso si tengo una clase empleado y escribo "where T: Empleado"?
`Juann!! como se podría recorrer el array por ejemplo cuando creaste director con distintos salarios ?? Con un foreach ?> porque no he visto como las imprimes de esta manera x consola, cuando lo intento no me da los detalles
for (int i=0;i < 3;i=++) { Console.Writeline(empleados.getEmpleado(i)); } No se si te refieres a eso pero las posiciones cuando las vas a imprimir las tienes que llamar por el lugar en donde están guardadas, para recorrerlas todas haces un barrido.
@@RrAztAfaray95 hola, has respondido hace tiempo. He llegado a tu respuesta, pero primero he intentado con un foreach. pero no pude ¿Es posible hacerlo con un foreach?
no entendí bien la programación genérica, que diferencia hay si se guardan en un array?, podrías poner situaciones que sean mas reales en un curso? o un curso en donde hagamos un proyecto utilizando todo lo visto.
En los videos anteriores explicó que era para evitar el uso excesivo de casting y porque con clases genéricas los errores te los da en tiempo de compilación en lugar de ejecución, lo que te ahorra muchos dolores de cabeza. El guardarlos en el array creo que es solo el ejemplo que dió porque es con el que estamos más familiarizados a esta altura del curso. Pero en sí es el manejo de los tipos de objetos, no solamente en arrays (creo) Es difícil que ponga "un caso real" porque hay infinitas opciones y lo que a una persona le serviría quizás los demás no es lo que ande buscando, por eso trata de ser lo mas abarcativo posible. Soy bastante nuevo en este mundo... Y en el curso de Python me sentía igual, pero poco a poco te vas nutriendo de info para hacer tus propios proyectos!
todavia no llegue al video de colecciones, pero esto de los genericos puede hacerse mediante colecciones y simplifcar todo esto ? me está pareciendo muy rebuscado
Únicamente faltaría comentar cómo funcionan estos arrays, ya que te puedes perder en la variable [i] cuando estas aprendiendo de 0. El resto perfecto como siempre!
Sus videos siguen un patron de aprendizaje progresivo, por lo que el siempre utiliza recursos que ya haya ensenado en videos anteriores. Esta de mas que el explique como funciona un Array cuando ya el lo explico en clases pasadas, el siempre asume de que sabes lo que vez por que ya te lo enseno.
@@bryanc343 secretarios incluye a las secretarias y secretarios. Secretarias es muy sesgado y bueno, hace 30 años vale, pero ya hemos evolucionado un poquillo ¿No?
Con todo respeto, creo que estás llevando a cabo demasiados cursos a la vez. Soy seguidor de tu curso de Spring y es realmente lento el progreso del avance de ese curso.
Nos esta ofreciendo estos grandiosos cursos de forma gratuita, creo que eso ya vale bastante, pero quejarse por el progreso de tiempo de aquello es algo estúpido, si gustas aprender rápido metete a cursos online de paga, Buena Suerte!
@@johanlopez9559 Mi comentario tiene casi 2 años de antiguedad. Estúpido es contestar ahora xD. Que algo sea gratuito no es excusa para que esté mal hecho o no cumpla los estándares de tiempo que el creador indica al comienzo del curso. De hecho es por culpa de gente como tu que los servicios públicos son tan malos sin que a nadie le importe.
@@houkoisthebest En este caso no importa el tiempo mientras que el servicio cumpla las satisfacciones del usuario, porque puedes volver a repasar, pero quejarte por el progreso de algo ofrecido por propia voluntad es lo máximo, quizás por gente como tu que depende de lo que le pueda ofrecer su gobierno el país no avanza.
@@johanlopez9559 Si no vas a cumplir las fechas que tu mismo estableces en los videos iniciales, no estás prestando "un buen servicio". Más fácil es no prometer fechas. Vuelve a la escuela, es obvio que tu comprensión de la realidad es propia de un preadolescente.
@@houkoisthebest Este comentario es algo viejo, de todas formas, el nunca estableció una fecha en la que subiría los videos, de hecho en el video inicial dijo que lo haría en sus tiempos libres Saludos.
Te recomiendo que no mezcles las variables de clase y las variables locales, generas inconsistencia de datos. Por que en el ejemplo usas "this.i " y en otras ocasiones solo usas "i" (no es recomendable hacerlo y en ocasiones genera errores). Solo una recomendación, de lo demás todo bien.
muy buena la explicacion pero la verdad lamentable el machismo implícito... por que no directorA y secretariO, no les parece? ay que dejar de naturalizar estas cosas
is incriibli il michismi impliciti en todo lado estos progres y defensores de lo moral, hasta en videos de enseñanza de otro asunto totalmente diferente.
Que potencia tiene esto!! Yo vengo de pascal, donde hay que codear mas!! Esto tienen muchisima utilidad!! Gracias por el curso!! Esta muy bueno
Al principio me confundí un poco con este tema pero, al ver los tres videos y repasar un poco los ejemplos, ahora me siento bastante seguro. ¡Muchas gracias por tu esfuerzo y un saludo desde Nuevo León, México!
Lo que tu tan facilmente enseñas con ese talento que tienes, los libros no lo hacen, este tipo de videos nos ayudan ya que de tu propia experiencia si existen casos donde uno tenga que hacer modificaciones al codigo tu lo explicas, eso no lo haria nadie a quien no le apasione algo como la programacion, por eso ademas de ser un excelente maestro, nos enseñas segun tu experiencia propia. Gracias
Madre mía, tron, qué curso más salvaje.
Saludos!, Juan seria bueno si impartiera un curso de git... Gracias.! Por tus aportes
Entendí el tema a la perfección, no había escuchado hablar de los genéricos antes, una increíble herramienta. Con mucho ánimo de terminar un curso más con usted, Profe 💪
Muchas gracias!
Hola Juan, me gradué en una carrera administrativa, aunque actualmente trabajo con proyectos informáticos, y tengo bastante noción, por lo que estoy aprendiendo a desarrollar con tu curso. Muchas gracias por tu aporte.
Yo ya había visto en c++ las templates, es decir, funciones o procedimientos que tanto el parámetro devuelto como el argumento eran de tipo genérico y usaban también la notación , siendo T una convención, porque podrá ser G o guachimolli, por dedir cualquier cosa. No sé si en c# se puede hacer, y es que aún no e visto este capítulo; sólo 5 segundos.
Saludos Juan... muchos te felicitan por tu enorme explicación. Eres como el predicador das todo sin pedir nada a cambio.. Dios te bendiga grandemente...
Gente que no da todo, pidiendo a cambio, gana dinero, fama y estatus. Juan, que da todo y no pide nada a cambio, se lleva un "Dios te bendiga"
Muy buen tutorial!! Me sirvieron mucho los 3 videos para poder entender los operadores genéicos. Gracias por el aporte crack!
Algo curioso es que puedes combinar programación genérica con el polimorfismo o asignación polimórfica. con eso puedes tener objetos de tipo Director, Electricista y Secretaria en la clase AlmacenEmpleados, esto hace que el código sea más legible y sea más facil la escalabilidad de tu programa, algo así:
using System;
namespace Genericos
{
class Program
{
static void Main(string[] args)
{
AlmacenEmpleados empleados = new AlmacenEmpleados (5);
empleados.Agregar(new Director(1000));
empleados.Agregar(new Director(1500));
empleados.Agregar(new Director(2000));
empleados.Agregar(new Electricista(2500));
empleados.Agregar(new Secretaria(3000));
//empleados.Agregar(new Estudiante(2500)); //no deja agregar al estudiante porque no hereda o implementa a IEmpleado
IEmpleados [] array = empleados.Array;
foreach (var empleado in array)
{
Console.WriteLine(empleado.GetSalario());
}
}
}
class AlmacenEmpleados where T : IEmpleados //restriccion solo para los que tienen salario
{
private int i = 0;
private T[] array;
public AlmacenEmpleados(int z) {
Array= new T[z];
}
public int I { get => i; set => i = value; }
public T[] Array { get => array; set => array = value; }
public void Agregar(T empleado)
{
Array[I]= empleado;
I++;
}
public T GetEmpleado(int i) => Array[i];
}
}
interface IEmpleados
{
double GetSalario();
}
class Estudiante
{
private double edad;
public Estudiante(double edad)
{
this.Edad = edad;
}
public double Edad { get => edad; set => edad = value; }
}
class Director : IEmpleados
{
private double salario;
public Director(double salario) {
this.salario = salario;
}
public double GetSalario() => this.salario;
}
class Secretaria : IEmpleados
{
private double salario;
public Secretaria(double salario)
{
this.salario = salario;
}
public double GetSalario() => this.salario;
}
class Electricista : IEmpleados
{
private double salario;
public Electricista(double salario)
{
this.salario = salario;
}
public double GetSalario() => this.salario;
}
Buen aporte, compañere.
Excelentes vídeos de c#, muchas gracias por la explicación.
muy bueno aquí vamos
Gracias amigo, tu sabes explicar muy bien. Tus videos me han ayudan mucho.
pero que funcionalidad más bonita!!!
Genio!!!! Un abrazo Juan!
seria bueno ver estos genéricos con un ejemplo con Base de Datos y los otros videos como los constructores, herencias etc...
De este modo se puede almacenar dentro de una clase generica, objetos de diferente clase. Eso esta genial. Lo que veo dificil es despues volverlos a extraer para consultar sus atributos (salario), ya que habria que hacer un casting y no sabes de que clase es el elemento almacenado. ¿Alguna sugerencia?
hola amigo, tu si sabes de que clase estas almacenando, al momento de instanciar la clase generica, tu debes pasarle que tipo de objeto recibira, ahi sabes pues que tienes.
Muy buenos vídeos, estoy loco que entremos a Form
Viendo el video en medio del trabajo :)
Graciaas cx.
profesor buenas noches, saludos desde colombia. profesor estas clases genericas se declaran muy parecido a las list que diferencia hay entre estos dos. gracias
Hola Juan! Que tal? Estoy re-aprendiendo C# con tus videos sobre ese lengüaje y me esta ayudando mucho. Muchas gracias crack por todo el contenido que nos das para todos!
Quería hacerte una consulta, tenes pensado hacer unos tutoriales sobre Unity o Godot ?
Muchas gracias,
Saludos desde Argentina de Buenos Aires!!
te aconsejo hacer proyectos con todos los cursos en donde almacenes todo lo que enseñaron, para que después puedas abrirlos y consultarlos rápidamente
Aprender al mismo tiempo c# y Python 3 al mismo tiempo es un poco confuso a lo primero pero se puede, ¿que diferencias en pocas palabras separan a estos lenguajes? Saludos tus tutoriales se comprenden muy bien sigue sí que está bárbaro esta manera de aprender
¿Pudiste aprender ambos lenguajes a la vez? Yo traté de hacer lo mismo pero me era difícil ya que mezclaba los conceptos de los lenguajes y tuve que dejar Python para después.
Secretaria sueldo = empleados.getDatosEmpleados(1);
Console.WriteLine((double)sueldo.getSalario());
para poder imprimir tuve que hacer esto
Dentro de ese Array de genérico no podrían meterse objetos de tipo Secretario y Director a la vez?
AlmacenaEmpleados empleados = new AlmacenaEmpleados(2); //de esta forma se puede
muy bueno
La class Estudiante no ereda el :IParaEmpleados y tambien tendria que tener por polimorfismo getSalario para que valide a Estudiante en la instancia.
Buenas !!
Me pregunto si en C# no existe un equivalente al ArrayList de Java.
Muchas gracias de antemano !!
hola recien empiezo con el curso y me surge una duda aqui, para aprovechar codigo pudiera haber hecho mi clase generica con el constructor salario y el metodo getsalario y solo poner que hereden de ella??
Buenas tengo una duda, ¿es necesario que la clase en cuestión implemente explícitamente la interfaz o basta con que cumpla los requisitos de la misma? Es decir que si por ejemplo el estudiante tuviese un método de nombre getSalario() pero su clase no llevara la interfaz : IParaEmpleados podría ser tratada por la clase genérica.
Llego tarde pero por si alguien tiene la misma pregunta y ve este video ahora, eso no es posible. Debes si o si implementar la interfaz de IParaEmpleados, si no lo implementas en la clase Estudiante y dentro de su bloque creas el método con el mismo nombre, con mismo tipo de parámetros y tipo de dato del método (o sea, un método exactamente igual que la interfaz "IParaEmpleados") C# va a tomar como que ese método creado no tiene nada que ver con la interfaz, si no que, es un método creado de la clase estudiante y no implementado de la interfaz, por lo tanto, no es posible usarlo en la clase genérica.
La forma para que pueda suceder, es que implementes la interfaz explícitamente: "IParaEmpleados".
a la hora de declarar la clase Estudiante ya que, de esa manera ahí si estarías implementando la interfaz y estar obligado a crear el método, y será posible utilizarlo en la clase genérica ya que, la restricción de la clase genérica era que solo podía utilizarse con tipos que implementen la interfaz "IParaEmpleados"
Esa restricción funcionaría si en vez de utilizar una interfaz lo hago con clases que hereden de otra? en este caso si tengo una clase empleado y escribo "where T: Empleado"?
ya vi que si :3
Una cosa INTERESANTE!: POR QUE LOS METODOS DE LA INTERFACE HOY EN DIA PUEDEN SER DESARROLLADOS?
`Juann!! como se podría recorrer el array por ejemplo cuando creaste director con distintos salarios ??
Con un foreach ?> porque no he visto como las imprimes de esta manera x consola, cuando lo intento no me da los detalles
for (int i=0;i < 3;i=++)
{
Console.Writeline(empleados.getEmpleado(i));
}
No se si te refieres a eso pero las posiciones cuando las vas a imprimir las tienes que llamar por el lugar en donde están guardadas, para recorrerlas todas haces un barrido.
@@RrAztAfaray95 hola, has respondido hace tiempo. He llegado a tu respuesta, pero primero he intentado con un foreach. pero no pude ¿Es posible hacerlo con un foreach?
Como se podria crear un descargador de video
Llegué temprano :)
no entendí bien la programación genérica, que diferencia hay si se guardan en un array?, podrías poner situaciones que sean mas reales en un curso? o un curso en donde hagamos un proyecto utilizando todo lo visto.
En los videos anteriores explicó que era para evitar el uso excesivo de casting y porque con clases genéricas los errores te los da en tiempo de compilación en lugar de ejecución, lo que te ahorra muchos dolores de cabeza. El guardarlos en el array creo que es solo el ejemplo que dió porque es con el que estamos más familiarizados a esta altura del curso. Pero en sí es el manejo de los tipos de objetos, no solamente en arrays (creo)
Es difícil que ponga "un caso real" porque hay infinitas opciones y lo que a una persona le serviría quizás los demás no es lo que ande buscando, por eso trata de ser lo mas abarcativo posible. Soy bastante nuevo en este mundo... Y en el curso de Python me sentía igual, pero poco a poco te vas nutriendo de info para hacer tus propios proyectos!
Entonces los genéricos sólo sirven para hacer colecciones de instancias? 🤔
todavia no llegue al video de colecciones, pero esto de los genericos puede hacerse mediante colecciones y simplifcar todo esto ? me está pareciendo muy rebuscado
👀
Se puso dificil la materia *ha salido del grupo*
Volve, la programación te necesita
Únicamente faltaría comentar cómo funcionan estos arrays, ya que te puedes perder en la variable [i] cuando estas aprendiendo de 0. El resto perfecto como siempre!
Sus videos siguen un patron de aprendizaje progresivo, por lo que el siempre utiliza recursos que ya haya ensenado en videos anteriores. Esta de mas que el explique como funciona un Array cuando ya el lo explico en clases pasadas, el siempre asume de que sabes lo que vez por que ya te lo enseno.
Siglo XXI y seguimos diciendo secretarias...
¿Cómo se dice entonces? jajaja
@@bryanc343 secretarios incluye a las secretarias y secretarios. Secretarias es muy sesgado y bueno, hace 30 años vale, pero ya hemos evolucionado un poquillo ¿No?
@@PabloAM50 pero eso es machismo ¿o es machismo decir solo secretarias?
Naaa mentira jaja, gracias por la aclaración 😁.
@@PabloAM50 ahora se le dice secretaries... pinche lenguaje integral
@@diegolongo6560 evidentemente no se dice así, pinche incultura...
Con todo respeto, creo que estás llevando a cabo demasiados cursos a la vez. Soy seguidor de tu curso de Spring y es realmente lento el progreso del avance de ese curso.
Nos esta ofreciendo estos grandiosos cursos de forma gratuita, creo que eso ya vale bastante, pero quejarse por el progreso de tiempo de aquello es algo estúpido, si gustas aprender rápido metete a cursos online de paga, Buena Suerte!
@@johanlopez9559 Mi comentario tiene casi 2 años de antiguedad.
Estúpido es contestar ahora xD.
Que algo sea gratuito no es excusa para que esté mal hecho o no cumpla los estándares de tiempo que el creador indica al comienzo del curso. De hecho es por culpa de gente como tu que los servicios públicos son tan malos sin que a nadie le importe.
@@houkoisthebest En este caso no importa el tiempo mientras que el servicio cumpla las satisfacciones del usuario, porque puedes volver a repasar, pero quejarte por el progreso de algo ofrecido por propia voluntad es lo máximo, quizás por gente como tu que depende de lo que le pueda ofrecer su gobierno el país no avanza.
@@johanlopez9559 Si no vas a cumplir las fechas que tu mismo estableces en los videos iniciales, no estás prestando "un buen servicio".
Más fácil es no prometer fechas.
Vuelve a la escuela, es obvio que tu comprensión de la realidad es propia de un preadolescente.
@@houkoisthebest Este comentario es algo viejo, de todas formas, el nunca estableció una fecha en la que subiría los videos, de hecho en el video inicial dijo que lo haría en sus tiempos libres
Saludos.
Te recomiendo que no mezcles las variables de clase y las variables locales, generas inconsistencia de datos. Por que en el ejemplo usas "this.i " y en otras ocasiones solo usas "i" (no es recomendable hacerlo y en ocasiones genera errores). Solo una recomendación, de lo demás todo bien.
Se ve que no has visto ninguno de los vídeos anteriores, donde ya explicó claramente lo de la inconsistencia, y el uso del This.
Un saludo
muy buena la explicacion pero la verdad lamentable el machismo implícito... por que no directorA y secretariO, no les parece? ay que dejar de naturalizar estas cosas
este no es un canal de progresismo es un canal de programacion
sino te parece el contenido largate a otro lugar
is incriibli il michismi impliciti
en todo lado estos progres y defensores de lo moral, hasta en videos de enseñanza de otro asunto totalmente diferente.