class Program { static void Main(string[] args) { B b = new B(); b.Run(); Console.Read(); } } class A { public event Action onChanged; public void Raise() { if (onChanged != null) onChanged(); } } class B { public void Run() { A a = new A(); a.onChanged += a_onChanged; a.Raise(); } private void a_onChanged() { Console.WriteLine("Wow! Invoked"); } } I am not able to figure out the Valid points which can justify that I broke encapsulation or may be otherwise. As per my understanding I am breaking encapsulation as a private method is getting called from another class, Is this enough for justifying that I broke on the laws of OOP. Need to gather some more inner concepts and descrption for the code above.
3 Réponses :
Non, vous n'avez pas rompu l'encapsulation et une méthode privée est appelé d'une autre classe em> n'est pas vrai dans ce cas. Classe B code> crée son propre
A code> et appelle son
monte code> méthode qui soulève un événement code> Onchanged code>.
Vous vous inscrivez à cet événement b code> c'est donc complètement bien. p>
Vous n'avez pas rompu l'encapsulation sur la classe B, car les instances de B ne se modifient que, mais oui, vous avez enfreint l'encapsulation sur la classe A. Tout ce qui a une référence à une instance d'A peut soulever l'événement ONCHANGED. P >
Les événements ne peuvent être abonnés qu'aucune "modification" en tant que telle. Les événements sont conçus pour fonctionner de cette façon et être accessibles au public si nécessaire. Je considérerais l'encapsulation sur un événement à briser uniquement lorsqu'un cours externe peut soulever l'événement. Ce qui se passe soit vrai dans ce cas, quel que soit le champ Onchanged code> peut être "modifié"
Cela dépend vraiment de la raison pour laquelle avez-vous une méthode code> code> en classe A. p>
S'il existe uniquement pour permettre l'accès à un membre privé, la réponse serait la suivante: Oui, votre encapsulation a été compromise. Toutefois, si ce n'est qu'un simple instantané pour faire un point et que l'événement code> augmenter code> est une méthode qui déclenche l'événement comme effet secondaire à une action prise (quelque chose comme changer de texte dans Un Je brise l'encapsulation comme une méthode privée est appelée
d'une autre classe p>
blockQuote>
de Wikipedia : P>
L'encapsulation est utilisée pour masquer les valeurs ou l'état d'une donnée structurée
objet dans une classe, empêchant l'accès direct des parties non autorisées
pour eux. Les méthodes accessibles au public sont généralement fournies dans la
classe (appelée getters and Setters) pour accéder aux valeurs et d'autres
Les classes de clients appellent ces méthodes pour récupérer et modifier les valeurs
dans l'objet. P>
blockQuote>
C'est ok pour que la méthode privée soit appelée d'un public. Comment cela serait-il appelé? C'est à vous, le programmeur, d'obtenir votre méthode logique droite et de vous assurer qu'ils appellent les méthodes appropriées. P>
L'événement ONCHANGED code> devrait se produire lorsque quelque chose a changé et non lorsque une classe externe décide qu'il devrait. P>
Textbox code> puis déclenchant
OntextCommé code>) que votre encapsulation est toujours en tact. p>
+1 pour S'il existe uniquement pour permettre l'accès à un membre privé, la réponse serait la suivante: Oui, votre encapsulation a été compromise code>. L'encapsulation est utilisée pour s'assurer que l'objet lui-même peut contrôler son comportement et l'état est valide. Autoriser les parties externes à déclencher l'état supprime ce contrôle et peut donc faire se comporter un objet avec un comportement non défini.
@Avi - NE PAS Capable de comprendre qu'est-ce que vous essayez de dire ici- "Cependant, s'il s'agit d'un simple instantané pour faire un point, et que l'événement de soumission est une méthode qui déclenche l'événement comme effet secondaire à une action prise (Quelque chose comme changer de texte dans une zone de texte puis déclencher detextChanged) que votre encapsulation est toujours en tact. "
@Bose_Geek Je veux dire que si ce n'est pas votre code réel qui soulève l'événement, et que le code réel ressemble plus à l'exemple de textchanged code>, alors votre encapsulation est toujours en tact. Si ce n'est toujours pas clair, faites le moi savoir et je posterai une démonstration.
@Avi - j'ai eu ton point. Je serais génial si vous pouvez démontrer également (simplement obtenir une image cristalline) qui peut montrer comment l'encapsulation de cas reste intacte.
@Bose_Geek J'ai posté un exemple de code . Si des clarifications supplémentaires sont nécessaires, veuillez vivre un commentaire ...
@Bose_Geek Si l'une des réponses vous a aidé, veuillez envisager de marquer une réponse comme acceptée.
FYI: Votre
action d'événement Onchanged code> doit être appelé
modifié code>. Le
Onxxx code> est utilisé pour les méthodes virtuelles qui augmentent ensuite les événements
xxx code>.
Rien n'est cassé. Vous avez envoyé une méthode privée dans une classe de déléguée, qui a le public
invoque la méthode code>. Votre événement appelle publique
invoquer code> méthode de délégué, quelle méthode d'appels, qui a été transmise à la délégation du temps d'initialisation.
"Oh, désolé ... ai-je cassé votre encapsulation?" - (lire à Samuel L. Jackson Voice) i>