Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3309 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  Interface internal

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Interface internal

n°1639341
Ummon
Posté le 08-11-2007 à 16:44:08  profilanswer
 

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
mood
Publicité
Posté le 08-11-2007 à 16:44:08  profilanswer
 

n°1639782
ixemul
Nan mais sans blague ! ⚡
Posté le 09-11-2007 à 10:27:54  profilanswer
 

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
n°1639807
MagicBuzz
Posté le 09-11-2007 à 11:00:22  profilanswer
 

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
n°1639810
MagicBuzz
Posté le 09-11-2007 à 11:05:26  profilanswer
 

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
n°1639907
Ummon
Posté le 09-11-2007 à 11:54:31  profilanswer
 

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...

n°1639932
MagicBuzz
Posté le 09-11-2007 à 12:03:36  profilanswer
 

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
n°1639997
Ummon
Posté le 09-11-2007 à 12:33:24  profilanswer
 

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.

n°1640004
MagicBuzz
Posté le 09-11-2007 à 12:38:22  profilanswer
 

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)

n°1640015
Ummon
Posté le 09-11-2007 à 12:44:06  profilanswer
 

ixemul a écrit :

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


J'ai corrigé mon post initial.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  Interface internal

 

Sujets relatifs
[AS3] De l'intérêt des classes internal ?Serveur BD - client avec interface comme open office BD
Interface GTK2 - Fonction zoom sur listeInterface web de gestion de code source.
Interface d'administration site web, pb récurrent du webInternal server error
[Projet] Programmer une interfaceApache + .htaccess (protection) = Erreur 500 Internal Server Error !
pb chez 1and1 : Error 500 - Internal server error 
Plus de sujets relatifs à : Interface internal


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR