none
Propiedad que acepte objetos de distintas clases RRS feed

  • Pregunta

  • Hola, hace poco empeze con C# en Visual Studio y hasta ahora venia bastante bien, lo unico que no he podido resolver y espero me puedan dar una mano es:

    Una propiedad de una clase tiene que aceptar objetos de distintos tipos...

    Es decir tengo 2 tipos de autos que son totalmente independientes (distintas clases), y el conductor puede conducir puede consucir cualquiera de estos, en su propiedad auto deve poder almacenar cualquiera de los dos typos.

    No le busquen la explicacion logica del problema solo es un ejemplo para que se entienda mejor.

    Entendiendo el problema por ahi hay alternativas que permitan llegar al mismo resultado.

    Gracias de antemano y saludos.
    martes, 7 de septiembre de 2010 18:35

Respuestas

  • hola

    el tema es que als colecciones tambien deben ser de un tipo concreto, no puedes mezclarlos

    pero si defines una funcionalidas basica podrias guardar info de varios tipos

    public class Propietario{

    }

    public class Proveedor : Propietario{

    }

    public class Cliente : Propietario{

    }

     

    public class IngresoMercaderia{

       public Propietario PropietarioMercaderia {get; set;}

    }

     

    esto podria recibir cualqueir de las clases anteriores, en la asigmacion

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 7 de septiembre de 2010 19:41
  •  
     
    "Mauro Castro" escribió en el mensaje de
    noticias:6afca8ef-cb15-4346-a82c-821f7afe4781...
    > no puedo limitar a que proveedor sea de una clase base para este fin
     
    En ese caso... para eso son las interfaces. Éstas definen comportamiento, no
    identidad. Por ejemplo, un auto y una persona se mueven, pero no son lo
    mismo, ni se relacionan. Entonces:
     

    interface IMovible { void Mover(); }
    class Persona : IMovible { public void Mover() { } }
    class Auto : IMovible { public void Mover() { } }

     
    Es lo mismo en tu caso. A lo mejor Cliente y Proveedor no tienen relación de
    identidad, por lo tanto no debería haber herencia. Pero sí tienen relación
    de comportamiento (i.e. comparten propiedades o comportamientos) así que
    deberías usar una interfaz.
     
    Dicho lo anterior, en .NET y C#, todos los objetos existentes tienen por lo
    menos una relación de identidad: todas heredan de object. Así que si no
    quieres interfaz, puedes poner que la propiedad sea de tipo object y dentro
    de éste revisar el tipo de dato del objeto que te pasen:
     
    public object PropietarioMarca
    {
      get { ... }
      set
      {
        if (value.GetType() == typeof(IngresoMercaderia))
          // hacer algo
        else if (value.GetType() == typeof(Clientes))
          // hacer algo
        ...etc...
      }
    }

     
    No es lo mejor, en mi opinión, pero bueno, es opción. Y ya por último,
    también podrías querer utilizar sobrecarga de métodos en lugar de una sola
    propiedad:
     
    public void SetPropietario(IngresoMercaderia mercaderia) { ... }
    public void SetPropietario(Cliente cliente) { ... }
    public void SetPropietario(Empleado empleado) { ... }

     
    Saludos.
     
     


    Fernando Gómez
    fermasmas.wordpress.com
    martes, 7 de septiembre de 2010 20:46
  • Si tu interfaz queda como:
     
    interface IMarca
    {
    string Marca { get; set; }
    }
     
    Tu clase quedaría como:
     
    private IMarca _propietarioMarca;
     
    public IMarca PropietarioMarca
    {
    get { return _propietarioMarca; }
    set { _propietarioMarca = value; }
    }
     
    y las implementaciones (IngresoMercaderia, Cliente, Empleado) quedarían algo
    así:
     
    class Cliente : IMarca
    {
    public void Cliente() { }
     
    public string Marca { "return marcaCliente"; }
    }
     
    o algo similar.
     
     


    Fernando Gómez
    fermasmas.wordpress.com
    martes, 7 de septiembre de 2010 22:45

Todas las respuestas

  • hola

    si la info de los autos sin iguales podrias crear una interfaz que sea implementada por ambas clases, o sino una clase base

    entocnes tu propiedades definida del tipo de la interfaz

    en este ejmeplo seria usando la clase base

    public Auto{

      public string Marca {get; set;}

    }

    public class Sedan : Auto {

    }

    public class Camina : Auto {

    }

     

    entonces tu propiedad la defines como Auto y podras contener tanto a Sedan como a Camion

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 7 de septiembre de 2010 18:45
  • Primero Gracias por contestar...

    Segundo: entiendo lo que decis pero no se si aplica o por ahi no me doy cuenta, te doy otro ejemplo que tal vez sea mas claro.

    Tengo una clase que es "Ingreso de Mercaderia", este tiene una propiedad "Propietario de la Mercaderia", a su vez tengo mas clases "Clientes, Proovedores, empleados, etc...".

    Esta propiedad "Propietario de la Mercaderia" de la clase "Ingreso de Mercaderia" deberia aceptar cualquier objeto de las clases anteriormente nombradas, es decir el propietario de la mercaderia que ingreso puede ser un Cliente, un Proovedor , un empleado, etc.

    Estuve viendo colecciones pero mis conocimientos son muy basicos todabia y no encontre como meter en una coleccion objetos de diferentes tipos.

     

    Espero se entienda.

    y gracias nuevamente.

    martes, 7 de septiembre de 2010 19:05
  • hola

    el tema es que als colecciones tambien deben ser de un tipo concreto, no puedes mezclarlos

    pero si defines una funcionalidas basica podrias guardar info de varios tipos

    public class Propietario{

    }

    public class Proveedor : Propietario{

    }

    public class Cliente : Propietario{

    }

     

    public class IngresoMercaderia{

       public Propietario PropietarioMercaderia {get; set;}

    }

     

    esto podria recibir cualqueir de las clases anteriores, en la asigmacion

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 7 de septiembre de 2010 19:41
  • Entiendo el tema es que en este proyecto muchas propiedades de todas las clases tienen estas caracteristicas, y no puedo limitar a que proveedor sea de una clase base para este fin ya que que cuando me encuentre por ejemplo en otra clase donde tengo una propiedad que puede ser un objeto proovedor o un cliente pero no un empleado ya no puedo usar esa clase base.


    martes, 7 de septiembre de 2010 19:55
  •  
     
    "Mauro Castro" escribió en el mensaje de
    noticias:6afca8ef-cb15-4346-a82c-821f7afe4781...
    > no puedo limitar a que proveedor sea de una clase base para este fin
     
    En ese caso... para eso son las interfaces. Éstas definen comportamiento, no
    identidad. Por ejemplo, un auto y una persona se mueven, pero no son lo
    mismo, ni se relacionan. Entonces:
     

    interface IMovible { void Mover(); }
    class Persona : IMovible { public void Mover() { } }
    class Auto : IMovible { public void Mover() { } }

     
    Es lo mismo en tu caso. A lo mejor Cliente y Proveedor no tienen relación de
    identidad, por lo tanto no debería haber herencia. Pero sí tienen relación
    de comportamiento (i.e. comparten propiedades o comportamientos) así que
    deberías usar una interfaz.
     
    Dicho lo anterior, en .NET y C#, todos los objetos existentes tienen por lo
    menos una relación de identidad: todas heredan de object. Así que si no
    quieres interfaz, puedes poner que la propiedad sea de tipo object y dentro
    de éste revisar el tipo de dato del objeto que te pasen:
     
    public object PropietarioMarca
    {
      get { ... }
      set
      {
        if (value.GetType() == typeof(IngresoMercaderia))
          // hacer algo
        else if (value.GetType() == typeof(Clientes))
          // hacer algo
        ...etc...
      }
    }

     
    No es lo mejor, en mi opinión, pero bueno, es opción. Y ya por último,
    también podrías querer utilizar sobrecarga de métodos en lugar de una sola
    propiedad:
     
    public void SetPropietario(IngresoMercaderia mercaderia) { ... }
    public void SetPropietario(Cliente cliente) { ... }
    public void SetPropietario(Empleado empleado) { ... }

     
    Saludos.
     
     


    Fernando Gómez
    fermasmas.wordpress.com
    martes, 7 de septiembre de 2010 20:46
  • Disculpa la ignorancia, usando  interface tendria dos clases distintas (clientes, proovedores) que tendrian cosas en comun marcadas por la interface... ahora si son clases diferentes como declaro una propiedad que acepte los dos tipos? o declarandola del tipo de la interface va a aceptar tambien las clases que la utilizan?

     

    Saludos.

     

     

    martes, 7 de septiembre de 2010 22:31
  • Si tu interfaz queda como:
     
    interface IMarca
    {
    string Marca { get; set; }
    }
     
    Tu clase quedaría como:
     
    private IMarca _propietarioMarca;
     
    public IMarca PropietarioMarca
    {
    get { return _propietarioMarca; }
    set { _propietarioMarca = value; }
    }
     
    y las implementaciones (IngresoMercaderia, Cliente, Empleado) quedarían algo
    así:
     
    class Cliente : IMarca
    {
    public void Cliente() { }
     
    public string Marca { "return marcaCliente"; }
    }
     
    o algo similar.
     
     


    Fernando Gómez
    fermasmas.wordpress.com
    martes, 7 de septiembre de 2010 22:45