2 votes

Comment créer des composants WinForms basés sur le type d'un objet

Disons que nous avons cette interface :

interface IVehicle { ... }

Et quelques classes l'implémentant :

class Car : IVehicle { ... }
class Boat : IVehicle { ... }
class Plane : IVehicle { ... }

Dans mon interface utilisateur, j'ai un FlowLayoutPanel et j'accède à une sorte d' IEnumerable avec plusieurs objets IVehicle différents.

Maintenant je veux créer un UserControl pour chacun des véhicules et l'ajouter au FlowLayoutPanel. Les contrôles seront un peu similaires, mais étant donné qu'il y a des véhicules de types différents, certains contrôles pourraient avoir besoin de paraître légèrement différents ou de fonctionner d'une manière différente pour que l'utilisateur puisse facilement gérer ses véhicules. Comment puis-je résoudre cela de la meilleure façon sans trop d'encombrement ?

2voto

Patrick McDonald Points 20645

Que diriez-vous d'utiliser une sorte de méthode de fabrique :

UserControl CreateControl(IVehicle vehicle) 
{
    if (vehicle is Car)
    {
        return new CarControl();
    }
    else if (vehicle is Boat)
    {
        return new BoatControl();
    }
    ...
}

2voto

Francis B. Points 4109

Dans votre interface IVehicle, vous pourriez ajouter une méthode pour obtenir le contrôle de l'utilisateur.

public interface IVehicle
{
    UserControl GetVehicleControl();
}

Si vous avez besoin d'un contrôle pour chaque véhicule, vous pouvez utiliser ce code :

public class Car : IVehicle
{
    public UserControl GetVehicleControl()
    {
         return new CarControl();
    }
}

Sinon, si vous avez besoin d'un seul contrôle pour chaque type de véhicule :

public class Car : IVehicle
{
    private static CarControl m_control;

    public UserControl GetVehicleControl()
    {
         if(m_control == null)
             m_control = new CarControl();

         return m_control;
    }
}

1voto

Grzenio Points 16802

Je ne suis pas sûr de ce que vous visez exactement, mais vous pouvez utiliser des génériques lorsque vous étendez les contrôles utilisateur de la manière habituelle :

public class VehicleControl: UserControl
where TVehicle:IVehicle
{
  //faites quelque chose de spécifique avec IVehicle 
}

public class CarControl : VehicleControl
{
  //ajouter des éléments spécifiques à la voiture
}

0voto

Fredrik Mörk Points 85694

Si vous savez à l'avance à quoi ressemble le mapping lors de l'écriture du code, vous pouvez le configurer avec des associations dans Dictionnaire:

private Dictionary _vehicleToControlTypeMappings = new Dictionary();

Chargez les associations au démarrage:

_vehicleToControlTypeMappings.Add(typeof(Car), typeof(CarControl));
_vehicleToControlTypeMappings.Add(typeof(Plane), typeof(PlaneControl));

...et fournissez une méthode pour obtenir un nouveau contrôle en fonction du véhicule:

private Control GetVehicleControl(IVehicle vehicle)
{
    Control result = (Control)Activator.CreateInstance(
        _vehicleToControlTypeMappings[(vehicle as object).GetType()]
        );
    // effectuer une initialisation supplémentaire du contrôle
    return result;
}

Ensuite, vous pouvez simplement passer des objets de types qui implémentent IVehicle dans la méthode:

IVehicle vehicle = new Car();
Control newctl = GetVehicleControl(vehicle);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X