2010-11-15 8 views
0

s'il vous plaît me expliquer comment ce code fonctionne et pourquoi il va creux une erreur dans la classe Bpourquoi la classe B renvoie une erreur

public class A 
    { 
     protected int x; 
     static void F(A a, B b) { 
      a.x = 1;  // Ok 
      b.x = 1;  // Ok 
     } 
    } 
    public class B: A 
    { 
     static void F(A a, B b) { 
      a.x = 1;  // Error, must access through instance of B 
      b.x = 1;  // Ok 
     } 
    } 
+0

Il dit que vous devez accéder via l'instance de B donc pas par ax = 1 dans la classe publique B: A – Younes

+0

Mais pourquoi quand B hérite de la classe A – NoviceToDotNet

+0

je suis confondre avec le code entier, comment dans le statique méthode les variables de référence sont passés et comment les non-statiques communiquent avec le statique ... – NoviceToDotNet

Répondre

2

code dans B ne peut accéder à une variable protégée par une expression qui a une compilation type de temps B ou un certain type dérivé de B. C'est essentiellement comment fonctionne l'accès protégé.

De la section 3.5.3 de la spécification du langage C# 4:

Lorsqu'un membre d'instance protégé est accessible en dehors du texte du programme de la classe dans laquelle elle est déclarée, et lorsqu'un membre d'une instance interne protégé est accédé en dehors du texte du programme dans lequel il est déclaré, l'accès doit avoir lieu dans une déclaration de classe dérivée de la classe dans laquelle il est déclaré. De plus, l'accès doit avoir lieu à une instance de ce type de classe dérivé ou un type de classe construit à partir de ce type. Cette restriction empêche une classe dérivée d'accéder aux membres protégés d'autres classes dérivées, même lorsque les membres sont hérités de la même classe de base.

+0

Monsieur, ce que je lis de mais je ne comprends pas, s'il vous plaît élaborer sur moi .. une grande confusion avec moi est de savoir comment non statiques communiquent avec le statique ... comme quand j'accède à n'importe quel statique statique dans le contexte il jette une erreur alors pourquoi pas ici – NoviceToDotNet

+0

je devrais le prendre comme une règle ou il y a une certaine logique derrière ceci que j'essaye d'explorer – NoviceToDotNet

1

Le mot-clé protected est un membre modificateur d'accès. Un membre protected est accessible à partir de la classe dans laquelle elle est déclarée, et à partir de tout class dérivé du class qui a déclaré à ce membre.

public class A 
    { 
     public int x; 
     public static void F(A a, B b) 
     { 
      a.x = 1; 
      b.x = 1; 
     } 
    } 
    public class B : A 
    { 
     public static void F(A a, B b) 
     { 
      a.x = 1; 
      b.x = 1; 
     } 
    } 

Pourquoi je redéfini avec public modificateur d'accès. Le modificateur protected a un accès restreint pour hériter des blocs class.

Class A { 
protected int x = 0; 
} 
Class B : A { 
private void SomeFunc() { 
    Console.WriteLine(this.x.ToString()); // This will work! 
} 
} 

Mais si vous essayez d'accéder x vous aurez rien à B.

B b = new B(); 
b.x; // Got nothing in IntelliSense 

Voir nous avons l'accès des x en fonction de B, mais il est par exemple n'a pas accès de x.

+0

je veux savoir pourquoi l'instance de B n'a pas accès à x, alors qu'il est disponible dans B en raison de l'héritage s'il vous plaît laissez élaborer J'ai mangé sur ce monsieur alors qu'il est accessible en utilisant ce mot clé comment est-ce possible? – NoviceToDotNet

+0

@NoviceToDotNet Techniquement, le contexte de x est restreint en B ({....}) blocs. Cela peut être seulement l'accès à ces blocs. –

+0

ne pas obtenir votre commentaire ci-dessus s'il vous plaît expliquez-moi monsieur c'est ce qui me dérange de comprendre toute l'étudiante – NoviceToDotNet

Questions connexes