2010-03-30 26 views
5

Ho una classe in cui un metodo chiama una classe nidificata. Voglio accedere alle proprietà della classe genitore dalla classe nidificata.Classe nidificata - chiamata della classe nidificata dalla classe genitore

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

    something.something = new ChildClass(); 

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

Come accedere a x, yez all'interno della classe figlio? Qualcosa che ha a che fare con il riferimento alla classe genitore, ma come?

+0

Grazie zach per mostrare il codice che stavo avendo difficoltà di mettere il codice in – insanepaul

+0

possibile duplicato (http: // StackOverflow .com/questions/185124/whats-the-best-way-of-access-the-control-in-the-encoding-class-from-the-nes) – nawfal

risposta

8

Usa la parola chiave this di passare un riferimento al 'te' al costruttore della ChildClass. [? Qual è il modo migliore per accedere al controllo nella classe contenitrice dalla classe annidata] -

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

Grazie, è molto chiaro per me capire: è la parola chiave "this" che non conoscevo di. – insanepaul

2

Vedere http://www.codeproject.com/KB/cs/nested_csclasses.aspx per un'esercitazione dettagliata sull'uso di classi nidificate in C#. Credo che tu stia cercando qualcosa di simile:

class OuterClass 
{ 
    public int y = 100; 

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

Così, al fine di accedere ai campi della classe esterna, è necessario un'istanza della classe esterna a disposizione della classe interna.

Tenete a mente che è possibile accedere ai campi statici della classe interna, senza un'istanza della classe esterna intorno:

class OuterClass 
{ 
    public static int y = 100; 

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

Voleva accedere alle proprietà dalla classe esterna dall'interno la classe annidata. Invece, penso che tutto ciò che hai fatto sia istanziato di nuovo la classe esterna ... e poi l'accesso alle proprietà. –

+0

Hai ragione. Probabilmente dovrai passare un riferimento esistente alla classe esterna, come menzionato da Lucero o Isacco. –

+0

Sì, quello che continuo a leggere, ma come faccio a creare un riferimento esistente? – insanepaul

2

È necessario passare a un riferimento all'istanza classe genitore, per esempio nel costruttore di ChildClass. Naturalmente puoi accedere ai campi ParentClass se sono statici.

Nota: se è stato eseguito Java, C# supporta solo la nozione della classe interna "statica".

+0

Questo è quello che non sto ottenendo, e so che è fondamentale, ma come faccio a passare un riferimento al costruttore. Certo, posso aggiungere la classe genitrice al costruttore della classe nidificata, ma cosa devo passare nel metodo della classe genitore che chiama il costruttore della classe figlio. Ho notato che posso accedere alle proprietà statiche sfortunatamente nessuna delle mie è :( – insanepaul

2

Bene, sul costruttore della classe nidificata passa un riferimento alla classe esterna. In questo modo è possibile accedere alle proprietà della classe genitore dalla classe nidificata.

Inoltre, vale la pena notare che le proprietà statiche della classe padre sono disponibili.

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

Esempio:

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

Questo è quello che non sto ottenendo, e so che è di base, ma come faccio a passare un riferimento al costruttore. Certo, posso aggiungere la classe genitore a il costruttore della classe nidificata, ma cosa devo passare nel metodo nella classe genitore che chiama il costruttore della classe figlio.Ho notato che posso accedere a proprietà statiche sfortunatamente nessuna delle mie è :( – insanepaul

+0

Pubblicato un esempio per una risposta più completa Prestare attenzione che il costruttore OuterClass sta creando un nuovo NestedsClass e NestedClass accede alla proprietà "someProperty "di OuterClass. –

+0

Devo creare una nuova classe nidificata dal costruttore della classe esterna? Potrei chiamare il costruttore della classe nidificata con un metodo dalla classe esterna con il parametro 'this' ad esempio ... cosa.ItemTemplate = new nestedclass (this); ... Si vede che tutto il lavoro è fatto nella classe annidata e un metodo della classe esterna lo chiama.Tuttavia ho fatto un rapido controllo e sembra che funzioni, quindi tutto ciò di cui avevo bisogno doveva passare nella parola chiave "this" – insanepaul

Problemi correlati