none
polimorfismo no funciona en case RRS feed

  • Pregunta

  • Hola foro : tengo el siguiente inconveniente
    que son dos inquietudes  

    Tengo webservice asmx  un clase abastracta qeu se llama Persona que no tiene ninguna propiedad de momento  y dos clases 
    mas que heran de esta : Clientes y proveedores . ej Cliente:persona

    cliente y proveeedores tiene como propidades codigo y dni.( Tambine tengo un clase persona que tiene codigo y dni) Lo que pense es agregar en la clase abstracta codigo y cuit 
    para lo que explico mas adelante.

    1)el tema que como publique el webservice ya no puedo cambiar la clase abstracta poruqe quedo cerrado con el cliente y no puedo publicar algo extra ya esta la documentacion. yo creo que se podra agregar las propiedades a las abstracta , total es abstracta y no afectara al proxy del 
    cliente . se podra? .

     
    2)Bueno tengo un metodo . no me deja hacer polimorficot dentro del case .y aqui voy porque a persona le quiero agregar esas dos propiedades
    agregaron un metodo validarFormulario para cada tipo de objeto. Esto se podra mejorar . 

               public static void GuardarPersona(Person persona,IList<Personas> personas)
            {

      {
                try
                {
                  foreach (var per in personas)
                    {
                      switch (per.GetType().Name)
                        {
                            case "Clientes":
                                {
                                    cliente  cliente =  (Cliente)per;
                                    ValidarPrimaria(persona, _cliente);
                                     AltaCliente();
                                    break;
                                }
                            case :"Proveedores"
                                 {}
                        }
                    }
                }
               

            }

            private static void ValidarPersona(Persona persona, Cliente cliente)
            {
                if (persona.Codigo != client.Codigo && persona.Dni != cliente.Dni)
                {
                    throw new MNotValidException();
                }
                
            }

            private static void ValidarPersona(Persona persona, Proveedor proveedor)
            {  
                if (persona.Codigo != proveedor.Codigo && persona.DNI!= cliente.DNI)
                {
                    throw new Exception();
                }

               } grcias




    miércoles, 16 de abril de 2014 4:51

Respuestas

  • yo creo que se podra agregar las propiedades a las abstracta , total es abstracta y no afectara al proxy del 
    cliente . se podra? .

    hasta donde entiendo no, si pones algo en la clase abstracta ya a afectar a las clases hijas, al menos en la definicion del wsdl que define el servicio

    ahora bien aunque agregues esto por ser algo a nivel de dato no uno en la firma del servicio lo que en realidad se afecta en el wsdl es la definicion del xsd que define las entidades tipadas del servicio por lo que si alguien invoca sin pasar ese dato serializado a lo sumo no asignara ningun valor para esas propiedades nuevas

    podrias hacer la prueba, quitas essas propiedades nuevas y crea un cliente de test generando el proxy, luego agrega las propiedades y publica

    acto seguida invoca desde el cliente al servicio que por supuesto no reflejara estas propeidades, si lo llamada sin error entonces lo que comento es valido

    ---

    Versioning Options

    tambien podrias ver si el versionaod del servicio te es util

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta sebastian viga miércoles, 16 de abril de 2014 22:40
    miércoles, 16 de abril de 2014 11:13
  • el casteo en el case es lo que mas odio. no me deja hacer polimorfico .net dentro del case .y aqui voy porque a formulario le quiero agregar esas dos propiedades

    pero porque en el case no usas el "is" pero con el if

    if(item is Cliente){

      //codigo

    } else if (item is Proveedor ){

       //codigo

    }

    ---

    igualmente recuerda que no necesitas de ningun if o case, si item es de un tipo determinado, que es base de ambas clases puedes hacer directo

    ValidarFormulario(persona, item);

    y esto llamara a la sobrecarga especifica

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta sebastian viga miércoles, 16 de abril de 2014 22:44
    miércoles, 16 de abril de 2014 11:20
  • Con el tema polimorfismo me da el siguiente error al compilar Argumento 2: no se puede convertir de 'Entidades.M.Formulario' a 'Entidades.M.Cliente'.

    si es verdad, teniendo una clasebase no puedes llamar a un metodo pero si podrias definirlo internamente

        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
    
                Persona persona1 = new Cliente();
    
                persona1.Metodo1();
    
            }
    
            
    
            private void Metodo1(Proveedor prov)
            {
            }
        }
    
    
        public abstract class Persona
        {
            public abstract void Metodo1();
        }
    
        public class Cliente : Persona
        {
            public override void Metodo1()
            {
                //aqui usas el this para acceder a la entidad
            }
        }
    
        public class Proveedor : Persona
        {
            public override void Metodo1()
            {
                //aqui usas el this para acceder a la entidad
            }
        }

    sino es cierto tienes que conocer de que tipo es la instancia para poder castear he invocar el metodo

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta sebastian viga miércoles, 16 de abril de 2014 22:40
    miércoles, 16 de abril de 2014 13:48

Todas las respuestas

  • yo creo que se podra agregar las propiedades a las abstracta , total es abstracta y no afectara al proxy del 
    cliente . se podra? .

    hasta donde entiendo no, si pones algo en la clase abstracta ya a afectar a las clases hijas, al menos en la definicion del wsdl que define el servicio

    ahora bien aunque agregues esto por ser algo a nivel de dato no uno en la firma del servicio lo que en realidad se afecta en el wsdl es la definicion del xsd que define las entidades tipadas del servicio por lo que si alguien invoca sin pasar ese dato serializado a lo sumo no asignara ningun valor para esas propiedades nuevas

    podrias hacer la prueba, quitas essas propiedades nuevas y crea un cliente de test generando el proxy, luego agrega las propiedades y publica

    acto seguida invoca desde el cliente al servicio que por supuesto no reflejara estas propeidades, si lo llamada sin error entonces lo que comento es valido

    ---

    Versioning Options

    tambien podrias ver si el versionaod del servicio te es util

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta sebastian viga miércoles, 16 de abril de 2014 22:40
    miércoles, 16 de abril de 2014 11:13
  • el casteo en el case es lo que mas odio. no me deja hacer polimorfico .net dentro del case .y aqui voy porque a formulario le quiero agregar esas dos propiedades

    pero porque en el case no usas el "is" pero con el if

    if(item is Cliente){

      //codigo

    } else if (item is Proveedor ){

       //codigo

    }

    ---

    igualmente recuerda que no necesitas de ningun if o case, si item es de un tipo determinado, que es base de ambas clases puedes hacer directo

    ValidarFormulario(persona, item);

    y esto llamara a la sobrecarga especifica

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta sebastian viga miércoles, 16 de abril de 2014 22:44
    miércoles, 16 de abril de 2014 11:20
  • Si el tema de las clases cliente y proveedor ya tiene id y dni, a la abstracta agrego esas propiedades no deberia influir. Pero c afecta en el wsdl es la definicion del xsd que define las entidades tipadas del servicio 
    miércoles, 16 de abril de 2014 13:32
  • Con el tema polimorfismo me da el siguiente error al compilar Argumento 2: no se puede convertir de 'Entidades.M.Formulario' a 'Entidades.M.Cliente'.

    si es verdad, teniendo una clasebase no puedes llamar a un metodo pero si podrias definirlo internamente

        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
    
                Persona persona1 = new Cliente();
    
                persona1.Metodo1();
    
            }
    
            
    
            private void Metodo1(Proveedor prov)
            {
            }
        }
    
    
        public abstract class Persona
        {
            public abstract void Metodo1();
        }
    
        public class Cliente : Persona
        {
            public override void Metodo1()
            {
                //aqui usas el this para acceder a la entidad
            }
        }
    
        public class Proveedor : Persona
        {
            public override void Metodo1()
            {
                //aqui usas el this para acceder a la entidad
            }
        }

    sino es cierto tienes que conocer de que tipo es la instancia para poder castear he invocar el metodo

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta sebastian viga miércoles, 16 de abril de 2014 22:40
    miércoles, 16 de abril de 2014 13:48
  • gracias  muy  bueno es como un visitor:)

    blic abstract class Persona
        {
            public abstract void Metodo1();
        }

        public class Cliente : Persona
        {
            public override void Metodo1()
            {
                  Validar(this)
            }
        }

        public class Proveedor : Persona
        {
            public override void Metodo1()
            {
                 Validar(this)
            }           

        }


     gracias



    miércoles, 16 de abril de 2014 16:26