OVH Cloud OVH Cloud

[C#] Lancer une fonction quelque soit le sender ??

3 réponses
Avatar
amplitude
Bonjour!

Alors voil=E0 : j'ai une form (form3) que je ne peux appeller que de 1=20
endroit (form1).

Les form1 contien un listview avec donc...une liste qui est remplis au=20
Load par une fonction LoadListe().

Pour mettre =E0 jour ma liste depuis ma form3, voil=E0 ce que je fais :

form3 =E0 en param=E8tre d'appel un "Perso.form1 sender"
je peux donc y faire ensuite un sender.LoadListe();
pour mettre ma liste =E0 jour.

Mais voil, je dois maintenant pourvoir faire la m=EAme chose, soit depuis=
=20
form1, mais aussi depuis form2 d'o=F9 je peux maintenant appeller form3..=
=2E

Je pr=E9cise que form2 contient aussi le LoadListe().

je pensait changer dans les paramtres du form3 pour mettre un "object=20
sender", avec 2 overload de parametres
1 avec "Perso.form1 sender"
et 1 avec "Perso.form2 sender"

Mais a ce moment l=E0, je ne sais pas comment attribuer =E0 sender le typ=
e
Dans le genre, voil=E0 ce que je voudrait faire :
sender.SetType(Perso.form1) dans le premier overload, et
sender.SetType(Perso.form2) dans le second...

J'esp=E8re m'=EAtre fait comprendre... merci =E0 touts! :)

Const.

3 réponses

Avatar
Paul Bacelar
Vous êtes nouveau dans le monde de l'objet ;-)



Je vous propose 2 solutions:



1) héritages

Form1 et Form2 dériverons de From0 qui dérivera de Form;

Form0 aura un méthode abstraite "abstract void LoadListe()" que les classes
Form1 et Form2 redéfiniront avec un "override void LoadListe()"

Votre champ sender sera de type Form0 ainsi que le paramètre du
constructeur.



2) Interface

Vous définissez une Interface ILoadListe{ void LoadListe();}

Form1 et Form2 implémente cette interface.

Votre champ sender sera de type ILoadListe ainsi que le paramètre du
constructeur.



Pas d'overload, pas de gestion de type, pas de prise de tête ;-)
--
Paul Bacelar


"amplitude" wrote in message
news:clji8a$jru$
Bonjour!

Alors voilà : j'ai une form (form3) que je ne peux appeller que de 1
endroit (form1).

Les form1 contien un listview avec donc...une liste qui est remplis au
Load par une fonction LoadListe().

Pour mettre à jour ma liste depuis ma form3, voilà ce que je fais :

form3 à en paramètre d'appel un "Perso.form1 sender"
je peux donc y faire ensuite un sender.LoadListe();
pour mettre ma liste à jour.

Mais voil, je dois maintenant pourvoir faire la même chose, soit depuis
form1, mais aussi depuis form2 d'où je peux maintenant appeller form3...

Je précise que form2 contient aussi le LoadListe().

je pensait changer dans les paramtres du form3 pour mettre un "object
sender", avec 2 overload de parametres
1 avec "Perso.form1 sender"
et 1 avec "Perso.form2 sender"

Mais a ce moment là, je ne sais pas comment attribuer à sender le type
Dans le genre, voilà ce que je voudrait faire :
sender.SetType(Perso.form1) dans le premier overload, et
sender.SetType(Perso.form2) dans le second...

J'espère m'être fait comprendre... merci à touts! :)

Const.
Avatar
amplitude
Oui, tout nouveau, et surtout dans la programmation autre que PHP :))

Tellement que je n'ai rien compris! :-|

Form1 et 2 sont trop différente je pense pour dérivées d'une autre Form...
pour la liste, je n'ai pas compris :(

Paul Bacelar wrote:
Vous êtes nouveau dans le monde de l'objet ;-)



Je vous propose 2 solutions:



1) héritages

Form1 et Form2 dériverons de From0 qui dérivera de Form;

Form0 aura un méthode abstraite "abstract void LoadListe()" que les c lasses
Form1 et Form2 redéfiniront avec un "override void LoadListe()"

Votre champ sender sera de type Form0 ainsi que le paramètre du
constructeur.



2) Interface

Vous définissez une Interface ILoadListe{ void LoadListe();}

Form1 et Form2 implémente cette interface.

Votre champ sender sera de type ILoadListe ainsi que le paramètre du
constructeur.



Pas d'overload, pas de gestion de type, pas de prise de tête ;-)


Avatar
Paul Bacelar
1)

Form1 et Form2 sont bien des forms, donc c'est suffisant pour qu'elles
dérivent de la même classe.

public abstract class Form0 : System.Windows.Forms.Form
{
public Form0(){}
public abstract void LoadListe();
}

public class Form1 : Form0
{
public Form1(){}
public override void LoadListe(){/*implementation Form1*/}
}

public class Form2 : Form0
{
public Form2(){}
public override void LoadListe(){/*implementation Form2*/}
}

public class Form3 : System.Windows.Forms.Form
{
Form0 sender;
public Form3(Form0 a_sender){sender = a_sender;}
public void myMethode(){sender.LoadListe();}
}

... = new Form3(new Form1(););
... = new Form3(new Form2(););


2)
public interface ILoadListe
{
void LoadListe();
}


public class Form1 : System.Windows.Forms.Form ,ILoadListe
{
public Form1(){}
public void LoadListe(){/*implementation Form1*/}
}

public class Form2 : System.Windows.Forms.Form ,ILoadListe
{
public Form2(){}
public void LoadListe(){/*implementation Form2*/}
}

public class Form3 : System.Windows.Forms.Form
{
ILoadListe sender;
public Form3(ILoadListe a_sender){sender = a_sender;}
public void myMethode(){sender.LoadListe();}
}

... = new Form3(new Form1(););
... = new Form3(new Form2(););


Comme vous pouvez le voir, avec les deux solutions, Form3 n'est plus
dépendant des types Form1 et Form2 mais uniquement de Form0 ou de
ILoadListe. Il n'a pas à connaître le type de sender mais seulement qu'il
peut appeler la méthode LoadListe sur cet objet.

Ainsi pour avoir un troisième type de formulaire "sender", vous dérivé de
Form0 une troisième classe ou vous implémentez l'interface ILoadListe dans
cette même classe (pas les 2 à la fois). Et c'est tout, vous ne touchez pas
du tout à la classe Form3 car, pour elle, que cela soit un nouveau type de
sender ne la trouble pas car elle sait que son sender à une méthode
LoadListe.

C'est une des applications les plus simples du polymorphisme.

Essayez l'une des 2 méthodes et vous verrez que c'est ultrasimple à étendre
comme architecture.

--
Paul Bacelar

"amplitude" wrote in message
news:clk37h$opc$
Oui, tout nouveau, et surtout dans la programmation autre que PHP :))

Tellement que je n'ai rien compris! :-|

Form1 et 2 sont trop différente je pense pour dérivées d'une autre Form...
pour la liste, je n'ai pas compris :(

Paul Bacelar wrote:
Vous êtes nouveau dans le monde de l'objet ;-)



Je vous propose 2 solutions:



1) héritages

Form1 et Form2 dériverons de From0 qui dérivera de Form;

Form0 aura un méthode abstraite "abstract void LoadListe()" que les


classes
Form1 et Form2 redéfiniront avec un "override void LoadListe()"

Votre champ sender sera de type Form0 ainsi que le paramètre du
constructeur.



2) Interface

Vous définissez une Interface ILoadListe{ void LoadListe();}

Form1 et Form2 implémente cette interface.

Votre champ sender sera de type ILoadListe ainsi que le paramètre du
constructeur.



Pas d'overload, pas de gestion de type, pas de prise de tête ;-)