Lista de Objetos polim贸rfica

6/35
Recursos

Vamos a crear un m茅todo que nos regrese todos los objetos Escuela de la escuela a trav茅s de un List de ObjetoEscuelaBase.

En C# podemos realizar validaciones sobre el tipo de objeto que estamos manejando, usando las siguientes palabras clave:

  • is, para verificar si un objeto es de un tipo en espec铆fico.
  • as, para tratar un objeto como un tipo espec铆fico, en caso de no poder convertir el objeto entonces va a asignar un valor null.

Aportes 23

Preguntas 7

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Reg铆strate o inicia sesi贸n para participar.

Me acabo de dar cuenta que en este punto reci茅n se meciona el 鈥渋s, as鈥 y en la evaluaci贸n del curso anterior, viene una pregunta sobre este tema. Me pareci贸 interesante y me hizo investigar un poquito. Aunque al final me termin茅 equivocando en la respuesta, ahora si lo acabo de entender.

Menos c贸digo

	   var obj = new Alumno();
            if((obj as Alumno) != null){
                //puedo usar objeto un alumno
            }

Esta pregunta sal铆a en el examen del curso anterior, ya dec铆a yo que este tema no lo hab铆a visto. 馃槄

En este caso considero que las clases abstractas como el poliformismo se emplea cuando se quiere tener un codigo estructura y organizado, ya que no es bueno emplear redudancia de codigo

Abstracta: Las clases abstractas son aquellas que por s铆 mismas no se pueden identificar con algo 鈥榗oncreto鈥 (no existen como tal en el mundo real), pero s铆 poseen determinadas caracter铆sticas que son comunes en otras clases que pueden ser creadas a partir de ellas.

Poliformismo: Se refiere a aquello que cuenta o que puede adoptar m煤ltiples formas

Recorrido alterno de los objetos utilizando lamda

Aporte: ver el minuto 5:49
Si necesitamos hacer uso de alumnoRecuperado2 y asegurarnos que el mismo no sea nulo para evitar errores en tiempo de ejecucion, tambien podriamos hacer lo siguiente:

if (obj is Alumno alumnoRecuperado2)
{
    var nombre = alumnoRecuperado2.Nombre;
    //..
    //..
}

Que buena clase, me recuerdo hace varios a帽os en la universidad cuando estudiaba algoritmos gen茅ticos e IA hacerme unos buenos mix de listas de varios tipos de objetos. Lo requer铆a para cuando creaba generaciones de algoritmos que mutaban pasando a la siguiente generaci贸n y necesitaban sacar lo mejor de sus padres y as铆, en ese momento casi todo lo hac铆a intuitivamente s贸lo teniendo claro lo de boxing y unboxing

Ejemplo de codigo con as

<using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Estudiantes
{
    class Lista
    {
        public void checkList()
        {
            List<Estudiante> estudiante = new List<Estudiante>();
            Estudiante s = new Estudiante();
            s.Nombre = "Pepe Sofia";
            estudiante.Add(s);

            Object prueba = new Cerdo();
            Perro conversion= prueba as Perro;
            if (conversion == null)
            {
                Console.WriteLine("Conversion fue null");
            }
            

        }

        
    }

}
>

Resultado

鈥楨studiantes.exe鈥 (CLR v4.0.30319: DefaultDomain): 鈥楥:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll鈥 cargado. Se omiti贸 la carga de s铆mbolos. El m贸dulo est谩 optimizado y la opci贸n del depurador 鈥楽贸lo mi c贸digo鈥 est谩 habilitada.
鈥楨studiantes.exe鈥 (CLR v4.0.30319: DefaultDomain): 鈥楥:\Users\Sem-6-INGENIERIAINDU\source\repos\Estudiantes\Estudiantes\bin\Debug\Estudiantes.exe鈥 cargado. S铆mbolos cargados.
鈥楨studiantes.exe鈥 (CLR v4.0.30319: Estudiantes.exe): 鈥楥:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll鈥 cargado. Se omiti贸 la carga de s铆mbolos. El m贸dulo est谩 optimizado y la opci贸n del depurador 鈥楽贸lo mi c贸digo鈥 est谩 habilitada.
鈥楨studiantes.exe鈥 (CLR v4.0.30319: Estudiantes.exe): 鈥楥:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll鈥 cargado. Se omiti贸 la carga de s铆mbolos. El m贸dulo est谩 optimizado y la opci贸n del depurador 鈥楽贸lo mi c贸digo鈥 est谩 habilitada.
鈥楨studiantes.exe鈥 (CLR v4.0.30319: Estudiantes.exe): 鈥楥:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Drawing\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll鈥 cargado. Se omiti贸 la carga de s铆mbolos. El m贸dulo est谩 optimizado y la opci贸n del depurador 鈥楽贸lo mi c贸digo鈥 est谩 habilitada.
鈥楨studiantes.exe鈥 (CLR v4.0.30319: Estudiantes.exe): 鈥楥:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll鈥 cargado. Se omiti贸 la carga de s铆mbolos. El m贸dulo est谩 optimizado y la opci贸n del depurador 鈥楽贸lo mi c贸digo鈥 est谩 habilitada.
鈥楨studiantes.exe鈥 (CLR v4.0.30319: Estudiantes.exe): 鈥楥:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll鈥 cargado. Se omiti贸 la carga de s铆mbolos. El m贸dulo est谩 optimizado y la opci贸n del depurador 鈥楽贸lo mi c贸digo鈥 est谩 habilitada.
鈥楨studiantes.exe鈥 (CLR v4.0.30319: Estudiantes.exe): 鈥楥:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Xml\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.dll鈥 cargado. Se omiti贸 la carga de s铆mbolos. El m贸dulo est谩 optimizado y la opci贸n del depurador 鈥楽贸lo mi c贸digo鈥 est谩 habilitada.
1
1
1
1
1
Conversion fue null
Conversion fue null
Conversion fue null

La forma que yo veo mas f谩cil de entender esto es teniendo en cuenta los conceptos de stack y heap dejo un enlace:
https://danielarancibia.wordpress.com/2013/12/15/tipos-de-datos-en-net-c-vb-net/

apenas veo esto y me quedo mal en la evaluaci贸n del curso anterior 馃槮

Concepto aprendido
Para hacer una pregunta o una asignaci贸n:
is: para preguntar si un objeto es de un tipo determinado.
as: tomar el segundo objeto(Alumno), como si fuera el primero (obj). Si se puede lograr me va a devolver informaci贸n. Si no lo puede lograr, me devuelve null.

Muy interesante

En este caso este seria un ejemplo para el caso de as y is

<using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Estudiantes
{
    class Lista
    {
        public void checkList()
        {
            List<Estudiante> estudiante = new List<Estudiante>();
            Estudiante s = new Estudiante();
            s.Nombre = "Pepe Sofia";
            estudiante.Add(s);

#pragma warning disable CS0184 // La expresi贸n dada de la expresi贸n "is" nunca tiene el tipo provisto
            if (estudiante is Estudiante)
            {
#pragma warning restore CS0184 // La expresi贸n dada de la expresi贸n "is" nunca tiene el tipo provisto
                Console.WriteLine("Esta correcto el objeto");
            }



            if (ValidarCampo(estudiante))
            {
                Console.WriteLine("Esta correcto el objeto");
            }

        }

        private static bool ValidarCampo(List<Estudiante> estudiante)
        {
            return estudiante as Perro;
        }
    }

}
>

Chido鈥


            //COMO EVITAR ERRORES EN TIEMPO DE EJECUCI脫N
            ob = evaluacion; // ob es de tipo Evaluacion
            if (ob is Alumno)
            {
                Alumno alumnoRecuperado = (Alumno)ob;
            }

            // SI NO LO PUEDE CONVERTIR DE VUELVE NULL
            Alumno alumnoRecuperado2 = ob as Alumno;

Muy interesantisimo

De est谩 forma se pueden ahorrar un if para validar si es null.
El operador (?) valida si el objeto, si no es null entonces se puede acceder directamente a la propiedad de dicho objeto.

var objBase = new ObjetoEscuelaBase();
var al = new Alumno();
al.Nombre = "Dennis";
var ev = new Evaluacion();
ev.Nombre = "Matem谩tica";
objBase = al;
objBase = ev;
               
var nomb = (objBase as Alumno)?.Nombre;

al tratarse de varios cursos se agrega AddRange en vez de Add

Muy interesante!

como 2 horas luchando con mi codigo hasta que por fin me queda como el profesor jajajaja

Otra alternativa de hacer uso de alumnoRecuperado2 seria: if (obj is Alumno alumnoRecuperado2) { //TODO }

F, Yo como loco buscando la respuesta en mis notas del curso pasado, Gran clase 鈾