2010-10-11 6 views
1

Je pense que je connais la réponse à cette question, mais j'espère que quelqu'un aura une solution soignée. Nous utilisons actuellement deux types de contrôles déroulants (Telerik et .Net). J'espère combiner ces derniers dans un contrôle, mais luttant avec un design convivial.Héritage dynamique en utilisant une usine

Idéalement, le contrôle serait créé dans le fichier de conception avec une propriété bool de, par exemple, "SimpleBox", pour déterminer le type de contrôle à hériter. L'instanciation serait alors générée dans le fichier de conception code-behind et le constructeur chargerait alors dynamiquement la base (ce qui n'est pas possible). La solution facile serait pour moi de créer une interface IDropDown, puis d'avoir une usine pour créer la bonne. Le seul vrai problème avec ceci est le fait que l'instanciation doit être écrite manuellement à chaque fois, ce qui est un problème, et n'accélère pas du tout notre processus.

Bien que ce ne soit pas directement possible, je cherche une solution dans le sens d'une usine qui est exécutée dans le constructeur d'objet pour définir la base, basée sur une propriété booléenne.

Vive

+0

Pourquoi faites-vous cela? Pourquoi avoir une propriété "SimpleBox" mieux que simplement choisir le bon contrôle pour la situation donnée et l'utiliser? –

+0

Nous avons utilisé les commandes telerik pour tout, mais comme nous utilisons beaucoup de telerik sur certaines de nos pages, telerik génère beaucoup de Mo de code par page. Utilisation de la norme. Net DropDownBox réduit considérablement la taille/vitesse. Je prévois de faire un adaptateur pour le DropDownBox afin qu'il puisse être branché à la place du combo telerik. Bien sûr, je fais tout cela pour limiter le refactoring (puisque j'ai codé des milliers de combos telerik) et avoir des méthodes communes pour toutes nos listes déroulantes. –

Répondre

4

Vous pourriez vouloir regarder dans la composition/délégation au lieu de l'héritage ici.

En substance, plutôt que d'étendre ou l'autre classe directement, créer une classe wrapper qui s'étend Control (ou quelque chose de tout aussi faible niveau) et met en œuvre IDropDown, ajoutez un champ IDropDown pour la mise en œuvre de commande sous-jacente que vous souhaitez utiliser et transmettre tous les appel de méthode intéressant la mise en œuvre sélectionnée. Cela devient rapidement fastidieux s'il y a beaucoup de méthodes, cependant.

+0

J'ai pensé à cela, mais pour compliquer davantage le problème, nous avons actuellement des contrôles héritant de notre base actuelle DropDownBox (qui sera remplacé par l'hybride). Les contrôles héritiers utilisent des gestionnaires d'événements protégés, mais puisque vous ne pouvez pas avoir de membres protégés dans une interface, je recevais toutes sortes de problèmes d'accès, peut-être que je me trompais. –

+1

@ 'g.foley' - Comme vous le dites, l'interface ne peut pas avoir de méthodes protégées, mais vous devez avoir une classe de base qui implémente l'interface, et la classe de base peut avoir des méthodes protégées. L'interface 'IDropDown' peut avoir un événement qui permet à votre classe hybride d'exposer les événements selon les besoins. – Enigmativity