2008-12-09 7 views
1
class Child 
{ 
    private override void Check_CheckedChanged(object sender, EventArgs e) 
    { 
     if (Check.Checked) 
     { 
      this.addName(this.FirstName); 
      this.disableControls(); 
     } 

     else 
     { 
      this.addAddress(this.address); 
      //this.activatecontrols();// gives error since it's private method in parent. 

     } 
    } 
} 

class Parent 
{ 
    private void Check_CheckedChanged(object sender, EventArgs e) 
    { 
     if (Check.Checked) 
     { 
      this.disablecontrols(); 
     } 

     else 
     { 
      this.addAddress(this.address); 
      this.activatecontrols(); 
     } 
    } 

} 

Je veux déclencher l'événement enfant s'il satisfait à la condition. Mais si je ne peux pas avoir besoin d'appeler la condition else de la base car activatecontrols() est privé dans Parent. Alors, comment puis-je appeler l'événement?Les événements d'incendie sélectivement en C#

Répondre

2

Une solution très simple serait de rendre le contrôle ActivateControls virtuel sur Parent et de le remplacer sur l'enfant, alors vous pouvez appeler base.activatecontrols dans la méthode enfant sinon Check.Checked.

+0

Simon, ajoutez le code, et vous aurez +1 :) –

+0

je vois Bryan déjà fait. J'allais alors à mon bébé a commencé à brailler ... le faire dormir je pense "quelqu'un va me rejeter à cause de la réponse vague". Je voulais aussi que le PO pense à ça aussi. –

+0

Il n'y a pas besoin de voter pour la réponse qui mène à la bonne direction. –

3

Si vous avez besoin de la fonctionnalité ActivateControls dans la classe dérivée, vous pouvez la rendre protected dans la classe de base.

Alternativement, vous pourriez avoir le gestionnaire appeler une méthode virtual d'événement Check_CheckedChanged dans la classe de base qui peut être redéfinie dans la classe dérivée:

// Parent.cs 

private void Check_CheckedChanged(object sender, EventArgs e) 
{ 
    OnCheckedChanged(); 
} 

protected virtual void OnCheckedChanged() 
{ 
    if (Check.Checked) 
    { 
     this.disablecontrols(); 
    } 
    else 
    { 
     this.addAddress(this.address); 
     this.activatecontrols(); 
    } 
} 

La logique de Parent n'a pas besoin d'être répété dans Child, de sorte que gestionnaire peut être simplifié:

// Child.cs 

protected override void OnCheckedChanged() 
{ 
    if (Check.Checked) 
    { 
     this.addName(this.FirstName); 
    } 

    base.OnCheckedChanged(); // Same outcome 
} 
+0

Je souhaite avoir remarqué le spécificateur privé sur le gestionnaire. Ne fais jamais ça moi-même. Je suppose que c'était protégé quand j'ai copié/collé. – tvanfosson

Questions connexes