Interface internal

Interface internal - C#/.NET managed - Programmation

Marsh Posté le 08-11-2007 à 16:44:08    

Bonjour,
 
Petite question mais vaste sujet :
Pourquoi les méthodes implémentant une interface "internal" doivent être publiques ( et pas "internal" ) ?
 
Mon avis est que cela n'a aucun sens.
 
Un peu dans la même veine j'avais posté une autre question à laquelle je n'ai jamais vraiment trouvé de réponse ( à part : "bon bein c'est comme ça en C#" ).

Message cité 1 fois
Message édité par Ummon le 09-11-2007 à 12:43:00
Reply

Marsh Posté le 08-11-2007 à 16:44:08   

Reply

Marsh Posté le 09-11-2007 à 10:27:54    

Ummon a écrit :

Bonjour,
 
Petite question mais vaste sujet :
Pourquoi les méthodes implémentant une classe "internal" doivent être publiques ( et pas "internal" ) ?
 
Mon avis est que cela n'a aucun sens.
 
Un peu dans la même veine j'avais posté une autre question à laquelle je n'ai jamais vraiment trouvé de réponse ( à part : "bon bein c'est comme ça en C#" ).


 
Il n'y a absolument pas de restriction sur le sujet.
 
Une classe internal peut contenir des méthodes internal, private, protected ou public.
Une classe publique peut contenir des méthodes internal, private, protected ou public.
 
par contre, qu'entends tu par "Méthode implémentant une classe internal" ? [:cerveau paysan]


---------------
VA APPRENDRE ET REVIENS QUAND TU SAIS, SINON ABSTIENT TOI C'EST UN GRAND CONSEIL QUE JE TE DONNE... TU ES INCOMPÉTENT ET C'EST UNE RÉALITÉ, TU N'AS RIEN A FAIRE ICI FAUT S'Y CONNAITRE ... -Jojo1998 - RIP - http://tinyurl.com/qc47ftk
Reply

Marsh Posté le 09-11-2007 à 11:00:22    

Je pense qu'il veut parler de ça :
 

Code :
  1. internal interface IA
  2.    {
  3.        string Print(string chaine);
  4.        string Print2(string chaine);
  5.    }
  6.  
  7.    internal class A : IA
  8.    {
  9.        public string Print(string chaine)
  10.        {
  11.            return string.Format("¤{0}¤", chaine);
  12.        }
  13.    }


 
Effectivement, "Print2" dans ma classe A ne peut pas être autrement que public.
 
Mais c'est normal : une interface défini le contrat des interfaces d'une classe. A partir de là, c'est normal que ces interfaces soient obligatoirement publiques.
 
Par contre, vu que la classe qui dérive de l'interface peut être internal, y'a pas de souci, tes méthodes ont de toute façon la portée public qu'à l'intérieur de la portée internal...
 
Mais imagine que la classe soit publique. Si les méthodes héritées de l'interface étaient internal, cela voudrait dire que le contrat ne serait respecté qu'à moitié, ça n'aurait pas de sens :spamafote:

Message cité 1 fois
Message édité par MagicBuzz le 09-11-2007 à 11:01:13
Reply

Marsh Posté le 09-11-2007 à 11:05:26    

Et pour le cas de l'héritage d'une classe, c'est plus simple : tu dois utiliser le même modifier (logique, c'est toujours la même histoire de contrat)
 

Code :
  1. internal interface IA
  2.    {
  3.        string Print(string chaine);
  4.    }
  5.  
  6.    internal class A : IA
  7.    {
  8.        public virtual string Print(string chaine)
  9.        {
  10.            return string.Format("¤{0}¤", chaine);
  11.        }
  12.    }
  13.  
  14.    internal class B : A
  15.    {
  16.        internal override string Print(string chaine) // Marche pas
  17.        {
  18.            return string.Format("@{0}@", chaine);
  19.        }
  20.    }


 


Erreur 1 'TestConsole.B.Print(string)' : ne peut pas changer les modificateurs d'accès en cas de substitution du membre hérité 'TestConsole.A.Print(string)' de 'public' C:\Users\MagicBuzz\Documents\Visual Studio 2005\Projects\TestConsole\TestConsole\Engine.cs 123 34 TestConsole


Message édité par MagicBuzz le 09-11-2007 à 14:50:04
Reply

Marsh Posté le 09-11-2007 à 11:54:31    

MagicBuzz a écrit :

Mais c'est normal : une interface défini le contrat des interfaces d'une classe. A partir de là, c'est normal que ces interfaces soient obligatoirement publiques.


Si le contrat est "internal" je ne voit pas pourquoi l'implémentation est publique...
Si une personne lit mon code est tombe sur une méthodes publiques il va tout de suite penser qu'elle peut être appelée depuis l'extérieur de l'assembly alors que ce n'est pas du tout le cas.
 

MagicBuzz a écrit :

Par contre, vu que la classe qui dérive de l'interface peut être internal, y'a pas de souci, tes méthodes ont de toute façon la portée public qu'à l'intérieur de la portée internal...


Ca veut dire quoi ?
"public" signifie une visibilité totale, également en dehors de l'assembly.
 

MagicBuzz a écrit :

Mais imagine que la classe soit publique. Si les méthodes héritées de l'interface étaient internal, cela voudrait dire que le contrat ne serait respecté qu'à moitié, ça n'aurait pas de sens :spamafote:


Non il serait respecté : visibilité de l'implémentation correspond bien à la visibilité du contrat...

Reply

Marsh Posté le 09-11-2007 à 12:03:36    

Ummon a écrit :


Si le contrat est "internal" je ne voit pas pourquoi l'implémentation est publique...
Si une personne lit mon code est tombe sur une méthodes publiques il va tout de suite penser qu'elle peut être appelée depuis l'extérieur de l'assembly alors que ce n'est pas du tout le cas.


Le contrat n'est pas internal.
C'est sa portée qui est internal.
A ton avis, pourquoi tu ne peux pas mettre d'access modifier aux méthodes d'une interface ? Tout simplement parcequ'elles sont obligatoirement publiques.
 
Et une règle de base de l'héritage, c'est que les méthodes héritées doivent avoir une accessibilité au moins aussi importante que celle de la classe de base... Sinon il se passe quoi si tu utilises une référence de la class de base pour gérer une instance de l'objet dérivé, et que tu appelles une méthode visible dans la classe de base ?
 

Ummon a écrit :


Ca veut dire quoi ?
"public" signifie une visibilité totale, également en dehors de l'assembly.


Les access modifier sont hérités. public ça signifie juste "aucune restriction par rapport au niveau supérieur. Dans tous les cas, c'est le modifier te ton père qui prime, et ensuite tu regardes si le fils est plus restrictif.
 

Ummon a écrit :


Non il serait respecté : visibilité de l'implémentation correspond bien à la visibilité du contrat...


Je vois ce que tu veux dire. Mais c'est surtout le modifier d'une interface qui ne devrait jamais pouvoir être autrechose que public (sinon l'interface perd de toute façon tout son intérêt, un contrat c'est fait pour être consultable, pas pour être rangé dans un coffre blindé).
 
Ceci dit, si tu hérites d'une classe qui défini déjà une méthode internal, tu peux tout à fait la rendre internal dans la classe héritée.
 

Code :
  1. internal class A
  2.    {
  3.        internal virtual string Print(string chaine)
  4.        {
  5.            return string.Format("¤{0}¤", chaine);
  6.        }
  7.    }
  8.  
  9.    internal class B : A
  10.    {
  11.        internal override string Print(string chaine)
  12.        {
  13.            return string.Format("@{0}@", chaine);
  14.        }
  15.    }

Message cité 1 fois
Message édité par MagicBuzz le 09-11-2007 à 12:06:14
Reply

Marsh Posté le 09-11-2007 à 12:33:24    

MagicBuzz a écrit :


Je vois ce que tu veux dire. Mais c'est surtout le modifier d'une interface qui ne devrait jamais pouvoir être autrechose que public (sinon l'interface perd de toute façon tout son intérêt, un contrat c'est fait pour être consultable, pas pour être rangé dans un coffre blindé).


 
Non pas du tout, il a beaucoup de cas ou des interfaces sont très pratiques à l'intérieur d'un assembly. Cela serait trop limitatif de restreindre l'utilisation d'interfaces uniquement entre deux assembly.

Reply

Marsh Posté le 09-11-2007 à 12:38:22    

Dans ce cas, si ton interface est internal, l'exemple de Taz dans l'autre topic n'est plus applicable, donc t'as plus de problème :spamafote:
 
En tout cas moi je vois pas de problème (si ce n'est que t'as deux topics sur le même sujet et que je sais plus où j'en suis dans mes explications)

Reply

Marsh Posté le 09-11-2007 à 12:44:06    

ixemul a écrit :

par contre, qu'entends tu par "Méthode implémentant une classe internal" ? [:cerveau paysan]


J'ai corrigé mon post initial.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed