2010-03-30 23 views
5

Tengo una clase mediante la cual un método llama a una clase anidada. Quiero acceder a las propiedades de la clase padre desde dentro de la clase anidada.Clase anidada: llamada a la clase anidada de la clase principal

public class ParentClass 
{ 
    private x; 
    private y; 
    private z; 

    something.something = new ChildClass(); 

    public class ChildClass 
    { 
     // need to get x, y and z; 
    } 
} 

¿Cómo accedo x, y y z desde dentro de la clase secundaria? Algo relacionado con hacer referencia a la clase para padres, pero ¿cómo?

+0

Gracias zach para mostrar el código que estaba teniendo dificultades para poner el código en – insanepaul

+0

posible duplicado de (http: // stackoverflow .com/questions/185124/whats-the-best-way-of-accessing-the-control-in-the-enclosing-class-from-the-nes) – nawfal

Respuesta

8

Uso del this palabra clave para pasar una referencia a 'sí mismo' al constructor de la ChildClass. [? ¿Cuál es la mejor manera de acceder al control en la clase envolvente de la clase anidada] -

public class ParentClass 
{ 
    public X; 
    public Y; 
    public Z; 

    // give the ChildClass instance a reference to this ParentClass instance 
    ChildClass cc = new ChildClass(this); 

    public class ChildClass 
    { 
     private ParentClass _pc; 

     public ChildClass(ParentClass pc) { 
      _pc = pc; 
     } 

     // need to get X, Y and Z; 
     public void GetValues() { 
      myX = _pc.X 
      ... 
     } 
    } 
} 
+0

Gracias, eso es muy claro para mí entender. Es la palabra clave 'this' que no sabía acerca de. – insanepaul

2

Consulte http://www.codeproject.com/KB/cs/nested_csclasses.aspx para obtener un tutorial detallado sobre el uso de clases anidadas en C#. Creo que estás buscando algo como:

class OuterClass 
{ 
    public int y = 100; 

    public class NestedClass 
    { 
     public static void abc() 
     { 
      OuterClass oc = new OuterClass(); 
      System.Console.WriteLine(oc.y);  
     } 
    } 
} 

Por lo tanto, con el fin de acceder a los campos de la clase externa, se necesita una instancia de la clase externa a disposición de la clase interna.

Tenga en cuenta que se puede acceder a los campos estáticos de la clase interna sin una instancia de la clase externa en torno a:

class OuterClass 
{ 
    public static int y = 100; 

    public class NestedClass 
    { 
     public static void abc() 
     { 
      System.Console.WriteLine(OuterClass.y);  
     } 
    } 
} 
+0

Quería acceder a las propiedades de la clase externa desde dentro la clase anidada En su lugar, creo que todo lo que hizo fue instanciar la clase externa de nuevo ... y luego accedió a las propiedades. –

+0

Estás en lo correcto. Probablemente necesites pasar una referencia existente a la clase externa, como lo mencionaron Lucero o Isaac. –

+0

Sí, eso es lo que sigo leyendo, pero ¿cómo hago una referencia existente? – insanepaul

2

Tiene que pasar en una referencia a la instancia de la clase padre, por ejemplo en el constructor de ChildClass. Por supuesto, puede acceder a los campos ParentClass si son estáticos.

Nota: Si alguna vez ha hecho Java, C# solo admite la noción de la clase interna "estática".

+0

Esto es lo que no obtengo, y sé que es básico, pero ¿cómo paso una referencia al constructor? Claro que puedo agregar la clase padre al constructor de la clase anidada, pero qué paso en el método en la clase padre que llama al constructor de la clase hija. Me di cuenta de que puedo acceder a propiedades estáticas desafortunadamente ninguno de los míos son :( – insanepaul

2

Bueno, en el constructor de su clase anidada pase en una referencia a la clase externa. De esta forma puede acceder a las propiedades de clase primaria desde dentro de la clase anidada.

Además, vale la pena señalar que las propiedades estáticas de la clase principal están disponibles para usted.

http://en.csharp-online.net/Nested_Classes

Ejemplo:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Application { 
    class OuterClass { 
     int someProperty = 10; 

     class NestedClass { 
      OuterClass reference; 

      public NestedClass(OuterClass r) { 
       reference = r; 
      } 

      public void DoSomething() { 
       Console.Write(reference.someProperty); 
      } 
     } 

     public OuterClass() { 
      NestedClass nc = new NestedClass(this); 
      nc.DoSomething(); 
     } 
    } 

    class Test { 
     public static void Main(string[] args) { 
      OuterClass oc = new OuterClass(); 
     } 
    } 
} 
+0

Esto es lo que no obtengo, y sé que es básico, pero ¿cómo paso una referencia al constructor? Claro que puedo agregar la clase padre a el constructor de la clase anidada, pero ¿qué paso en el método en la clase padre que llama al constructor de la clase hija?Noté que puedo acceder a las propiedades estáticas desafortunadamente ninguna de las mías es :( – insanepaul

+0

Publicó un ejemplo para una respuesta más completa. Preste atención que el constructor OuterClass está creando una nueva NestedsClass, y la clase NestedClass está accediendo a la propiedad "someProperty" "de la OuterClass. –

+0

¿Tengo que crear una nueva clase anidada desde el constructor de clase externo? Podría llamar al constructor de clase anidado con un método de la clase externa con el parámetro 'this' por ejemplo ... thing.ItemTemplate = nueva clase anidada (esto); ... Usted ve que todo el trabajo está hecho en la clase anidada y un método de la clase externa lo llama. De todos modos, he hecho una comprobación rápida y parece estar funcionando. Así que todo lo que necesitaba era pasar la palabra clave 'this' – insanepaul

Cuestiones relacionadas