2009-05-05 5 views
3

Je souhaite créer un groupe de formulaires ayant tous les mêmes propriétés et initialiser les propriétés dans le constructeur de formulaires en affectant les paramètres du constructeur.Windows Form inheritance

J'ai essayé de créer une classe qui hérite de la forme et dont tous mes formulaires héritent de cette classe, mais je pense que puisque je ne pouvais pas appeler InitializeComponent(), j'avais des problèmes.

Quel est le code C# sur la façon de faire cela?

+0

Quel genre de problèmes avez-vous eu? – Lucero

+0

Je ne pouvais pas appeler InitializeComponent() à partir de la classe de base. –

+0

Connexe: * [constructeur 'UserControl' avec des paramètres en C#] (http://stackoverflow.com/questions/1784303) * –

Répondre

6

devrait être appelé du parent InitializeComponent en ayant votre appel constructeur base() comme ceci:.

public YourFormName() : base() 
{ 
    // ... 
} 

(Votre formulaire parent doit avoir un appel à InitializeComponent dans son constructeur Vous n'avez pas enlever ça, avez-vous ?)

Cependant, la route que vous descendez n'est pas celle qui fonctionnera bien avec le concepteur, car vous ne serez pas en mesure de l'obtenir pour instancier votre formulaire au moment du design avec ces paramètres (vous devrez fournir un constructeur sans paramètre pour que cela fonctionne). Vous rencontrerez également des problèmes dans lesquels vous affectez des propriétés parent une seconde fois, ou les attribue à être différent de ce que vous auriez souhaité si vous utilisez votre constructeur paramétré dans le code.

Stick avec juste avoir les propriétés sur le formulaire plutôt que d'utiliser un constructeur avec des paramètres. Pour les formulaires, vous aurez vous-même mal à la tête.

+0

Je suis d'accord, le concepteur ne supporte pas bien l'héritage. J'ai eu de nombreux problèmes avec les formulaires/contrôles qui ont hérité les uns des autres. Parfois, le concepteur planterait, et si vous aviez une erreur dans l'une des classes de base, j'aurais souvent besoin de souffler mes formulaires existants et de revenir à une version précédente. Bien qu'il semble élégant, il a fini par être beaucoup trop de mal que ça valait la peine. – MedicineMan

+1

Il se peut que je manque quelque chose, mais que votre constructeur appelle base() comme ceci: public VotreFormName(): base() est redondant, et est l'action par défaut de C# inheritcance. base() va s'appeler implicitement de toute façon. Sinon, je suis d'accord avec le reste de votre réponse, essentiellement contrôler les travaux d'héritage, mais il est préférable de traiter les constructeurs zéro-arg dans la plupart des cas, ou assurez-vous que votre constructeur de temps de conception (zero-args) a les valeurs par défaut appropriées. – codenheim

1

Un autre modèle de l'héritage ici serait d'utiliser une usine pour créer les formulaires. De cette façon, votre usine peut définir toutes les propriétés

+0

Échantillon de code, s'il vous plaît? –

0

Créez une interface et transmettez-la dans le constructeur du formulaire.

interface IFormInterface 
{ 
     //Define Properties here 
} 

public MyForm(IFormInterface AClass) 
{ 
     //Set Properties here using AClass 
} 

Bien que je suis généralement faire plus que la mise des propriétés quand je veux faire quelque chose comme ça, alors je finis par créer une classe abstraite pour les comportements par défaut.