2010-09-03 8 views
1

Disons que j'ai une forme et son enfant et je veux l'enfant de déclencher son père sans les connaître les uns les autres autrement dit je veux que l'enfant soit génériqueC# - COMMEnT enfant et le parent comuncate

par exemple disons que j'ai un bouton de formulaire et un richTextBox et je veux avec evey cliquez pour changer le texte richTextBox

je veux la forme et le bouton pour ne pas se connaître comment puis-je le faire? i essaye celui-ci:

public partial class Form1 : Form 
{ 

    delegate void myfatherDelgate(); 
    static int msgCounter = 0 ; 

    public Form1() 
    { 
     InitializeComponent(); 
     button1 = new myButton(); 
     myfatherDelgate += myMethod(); 

    } 
    public void myMethod() 
    { 
     switch (msgCounter) 
     { 
      case 1: 
       { 
        richTextBox1.Text = "first click"; 
        msgCounter++; 
       } 
      case 2: 
       { 
        richTextBox1.Text = "second click"; 
       } 
      defult: this.Close; 
     } 



    } 


} 

public class mybutton: Bouton { int Myint statique;

protected override void OnClick(EventArgs e) 
    { 
     base.OnClick(e); 
     this.Parent.Invoke(myfatherDelgate()); 
    } 


} 

le plus simple est de le faire:

private void button1_Click(object sender, EventArgs e) 
    { 
     switch (msgCounter) 
     { 
      case 1: 
       { 
        richTextBox1.Text = "first click"; 
        msgCounter++; 
       } 
      case 2: 
       { 
        richTextBox1.Text = "second click"; 
       } 
      defult: this.Close; 
     } 
    } 

sous forme de père ...

Je pense que mon concept tout est de la merde peut quelqu'un en moi la lumière? mais je me trompe ici et c'est circulaire quelqu'un peut-il m'aider ici? ...

+6

Un enfant pauvre ne connaîtra jamais son père? Quel genre de monstre êtes-vous .. –

+0

je sais comment le faire où le père connait son fils et le contourner je demande une solution générique je sais que mon concept est un peu d'orabilité quelqu'un peut-il me conseiller sur un modèle de conception pour le résoudre –

+1

Un appel téléphonique de temps en temps ne fait jamais mal. Vous savez, restez en contact ... – jlafay

Répondre

2

Alors peut-être ce que vous cherchez est plus d'une implémentation de l'interface:

public interface IMyInterface { 
    void MyAction(); 
} 

public partial class form1 : Form, IMyInterface { 
    public void MyAction() { 
     richTextBox1.Text = "first click"; 
     ... 
    } 
} 

public class button1 : Button { 
    protected override void OnClick(EventArgs e) { 
     var parent = this.Parent as IMyInterface; 
     if(parent != null) { 
      parent.MyAction(); 
     } 
    } 
} 
+0

incroyable !!! la meilleure solution .... –

0

Dans votre exemple, le bouton sait que le parent Form a un délégué appelé myFartherDelegate. Pourquoi ne pas simplement gérer l'événement Button.Click sur le formulaire parent?

Votre code ressemblerait à quelque chose comme ça

public partial class Form1 : Form 
    { 
    static int msgCounter = 1; 
    public Form1() 
    { 
     InitializeComponent(); 
     button1.Click += new EventHandler(button1_Click); 
    } 

    void button1_Click(object sender, EventArgs e) 
    { 
     switch (msgCounter) 
     { 
     case 1: 
      { 
      richTextBox1.Text = "first click"; 
      msgCounter++; 
      } 
      break; 
     case 2: 
      { 
      richTextBox1.Text = "second click"; 
      } 
      break; 
     default: this.Close(); break; 
     } 
    }  
    } 

Le bouton n'est pas du tout au courant de la forme de parent, juste un bouton normal. Bien sûr, le parent enregistre son intérêt dans l'événement Click du bouton. Si vous avez besoin d'un couplage plus lâche que celui-ci, il peut être utile d'expliquer l'exigence plus en détail.

+0

cela semble être une bonne solution mais disons que j'ai 100 boutons est-ce la meilleure façon de l'implémenter? –

+0

@ yoav.str, est-ce que tous les boutons vont faire la même chose quand on clique dessus? Parce que c'est ce qui va se passer dans la solution proposée par @Zachary Yates. Tous les boutons sur le formulaire parent implémentant IMyInterface appellent tous MyAction, donc 100 boutons sur le formulaire font tous la même chose ou ai-je manqué quelque chose? Vraisemblablement, vous voulez que chaque bouton ait une action unique, donc vous câbleriez un gestionnaire d'événement approprié à chaque bouton, bien sûr vous pourriez toujours câbler le même gestionnaire à chaque bouton et ensuite vérifier l'argument 'expéditeur' pour décider d'une action spécifique. –

2

D'abord vous parlez des éléments enfants sur un formulaire, pas des sous-classes réelles d'un formulaire. Droite? Donc, vous voulez supprimer la dépendance entre le formulaire et le bouton. Cela pourrait être résolu avec des motifs de conception. Vous pourriez avoir un bouton pour implémenter une interface de say IButton. Ensuite, dans la forme, utilisez soit une classe Factory pour créer le bouton et renvoyez une référence IButton au lieu de MyButton. Ou, utilisez l'injection de dépendance au lieu d'une usine.

De toute façon, je ne vois pas d'avantage à ce que vous faites, pouvez-vous expliquer le problème plus en détail?

+0

pouvez-vous montrer cela dans un exemple simple? quel est le nom de ce motif? puis-je utiliser la réflexion pour décider du nom de la classe en cours d'exécution (ce sont les principaux pherpes ...)? –

+0

Travaillant dessus maintenant, Nevermind Yates réponse semble avoir ce que vous cherchez. – JonWillis

0

Si vous voulez un enfant à faire quelque chose à son père, le père doit au moins savoir que l'enfant existe. Il n'a pas besoin de connaître les détails, mais s'il est supposé réagir à son enfant, il a besoin d'un gestionnaire d'événement, d'un rappel, etc. que l'enfant invoquera. Cela peut être accompli avec un principe de base appelé le principe d'inversion des dépendances. Les classes qui dépendent de classes externes ne doivent pas dépendre d'implémentations concrètes, mais d'abstractions de l'implémentation. Le parent ne devrait pas avoir besoin d'un enfant spécifique, juste quelque chose qui ressemble à un et agit comme un.Les enfants, par la même occasion, ne devraient pas avoir à connaître leur Parent spécifique, mais si l'interaction est requise, l'Enfant doit avoir un moyen de dire quelque chose au Parent même s'il ne connaît pas l'écoute du Parent. Essayez un Parent (votre formulaire) qui contient une référence IChild (le bouton) et un gestionnaire d'événement public. Ensuite, créez un enfant qui implémente IChild et a un événement qu'il peut déclencher. Ensuite, vous avez besoin d'une troisième classe qui crée (ou est donnée) le parent et l'enfant, donne au parent l'enfant (comme un IChild), et connecte l'événement de l'enfant au gestionnaire d'événements du parent. Maintenant vous avez un parent qui sait seulement qu'il a quelque chose qui ressemble à un enfant, et vous avez un enfant qui a un drapeau qu'il peut brandir quand quelque chose d'important se produit, mais qui n'a pas besoin de savoir qui écoute.

+0

o voulez en savoir plus sur ce modèle est-il un exemple que je peux regarder? –

+0

Ceci est probablement mieux représenté par le motif Factory. La troisième classe, appelée une ParentFactory, serait demandée pour un Parent "hydraté", et l'Usine saurait que Parent avait besoin d'un Enfant pour être utile. Cela instancierait les deux, les accrocherait et les distribuerait. Pour une lecture de base sur l'utilisation des interfaces pour les dépendances abstraites, recherchez le couplage lâche, le principe de substitution de Liskov et le principe d'inversion des dépendances. – KeithS