2009-08-07 9 views
1

Je sais que c'est probablement simple, mais je n'arrive pas à comprendre si c'est possible.Simple C# Question: Imbrication des classes, accessibilité

Je le code suivant:

public class A {  
thisMethod(); 

public class B {  
    someMethod();  
    } 
} 


public class C {  
A myA = new A();  
A.B.someMethod();  
} 

Pourquoi ne puis-je accéder à B si je l'ai déjà instancié?

Merci de votre aide à l'avance!

Répondre

5

Vous avez besoin d'une instance de A.b pour appeler une méthode d'instance sur A.b:

A.B foo = new A.B(); 
foo.SomeMethod(); 

Dans votre exemple, vous n'étiez pas même d'essayer d'utiliser la nouvelle instance que vous aviez créé.

Si vous venez d'un arrière-plan Java, il peut être utile de souligner que les classes imbriquées en C# sont similaires à classes statiques en Java. Il n'y a pas de référence implicite d'une instance de la classe imbriquée à une instance de la classe conteneur. (L'accès est également inversé - en Java une classe externe a accès aux membres privés de sa classe imbriquée, en C# la classe imbriquée a accès aux membres privés de sa classe externe.)

+0

Je suppose que la raison pour laquelle je l'ai fait cette façon était juste pour le groupement logique. J'ai donc Player.Controls et Player.Library au lieu de toutes les méthodes dans une classe énorme. – WedTM

+0

Mais pourquoi les nicher? Pourquoi ne pas avoir des classes complètement séparées pour commencer, juste dans un espace de noms "Player"? –

0

Vous essayez d'y accéder comme si c'était une méthode statique ou une propriété de classe A appelée "B". Vous devez toujours créer une instance de celui-ci - c'est une déclaration de classe. Je pense que vous êtes à la recherche:

public class A {  

public A() 
{ 
    myB = new B(); 
} 

thisMethod(); 
public B myB 
{ 
get; set; 
} 

public class B {  
    someMethod();  
    } 
} 


public class C {  
A myA = new A();  
A.myB.someMethod();  
} 

Juste pour noter cependant, il est recommandé de ne pas exposer les classes imbriquées publiquement.