2013-05-01 10 views
8

ho erroreImpossibile accedere a un membro non statica di tipo esterno tramite tipo annidato

Impossibile accedere a un membro non statica di tipo esterno 'Project.Neuro' via tipo annidato 'Project.Neuro.Net '

con codice come questo (semplificato):

class Neuro 
{ 
    public class Net 
    { 
     public void SomeMethod() 
     { 
      int x = OtherMethod(); // error is here 
     } 
    } 

    public int OtherMethod() // its outside Neuro.Net class 
    { 
     return 123; 
    } 
} 

posso spostare metodo problematico classe Neuro.Net, ma ho bisogno di questo metodo al di fuori.

In genere di principiante di programmazione oggettiva.

Grazie in anticipo.

+1

Sembra abbastanza ovvio - 'OtherMethod' è un membro di un altro tipo. Il fatto che sia nidificato non significa che i metodi sono _inherited_. –

+1

Vedere questa risposta SO per ulteriori informazioni: http://stackoverflow.com/a/5393472/1451531 – Splendor

risposta

16

Il problema è che nidificati classi non sono derivano classi, quindi i metodi nella classe esterna non sono ereditato.

Alcune opzioni sono

  1. rendere il metodo static:

    class Neuro 
    { 
        public class Net 
        { 
         public void SomeMethod() 
         { 
          int x = Neuro.OtherMethod(); 
         } 
        } 
    
        public static int OtherMethod() 
        { 
         return 123; 
        } 
    } 
    
  2. utilizzare l'ereditarietà invece di classi di nidificazione:

    public class Neuro // Neuro has to be public in order to have a public class inherit from it. 
    { 
        public static int OtherMethod() 
        { 
         return 123; 
        } 
    } 
    
    public class Net : Neuro 
    { 
        public void SomeMethod() 
        { 
         int x = OtherMethod(); 
        } 
    } 
    
  3. creare un'istanza di Neuro:

    0.123.
    class Neuro 
    { 
        public class Net 
        { 
         public void SomeMethod() 
         { 
          Neuro n = new Neuro(); 
          int x = n.OtherMethod(); 
         } 
        } 
    
        public int OtherMethod() 
        { 
         return 123; 
        } 
    } 
    
+0

Ho reso il mio metodo statico. Ora mi chiedo come posso riorganizzare le mie lezioni ... forse è un buon argomento per un'altra domanda. – Kamil

2

è necessario creare un'istanza di un oggetto di tipo Neuro da qualche parte nel codice e chiamare OtherMethod su di esso, dal momento che OtherMethod non è un metodo statico. Sia che tu crei questo oggetto all'interno di SomeMethod, sia che lo passi come argomento, dipende da te. Qualcosa di simile:

// somewhere in the code 
var neuroObject = new Neuro(); 

// inside SomeMethod() 
int x = neuroObject.OtherMethod(); 

In alternativa, è possibile effettuare OtherMethod statica, che vi permetterà di chiamare da SomeMethod come ci si trova.

+0

OK. Grazie. Ora penso che dovrei riorganizzare il mio codice ... – Kamil

+0

Vorrei poter accettare 2 risposte ... – Kamil

+0

@Kamil non preoccuparti, D La risposta di Stanley è comunque più completa. – vlad

0

Sebbene classe è annidato all'interno di un'altra classe, non è ancora chiaro quale istanza di colloqui classe esterna alla quale istanza di classe interna. Potrei creare un'istanza della classe interna e passarla all'altra istanza della classe esterna. Pertanto, è necessario disporre di un'istanza specifica per chiamare questo OtherMethod().

È possibile passare l'istanza sulla creazione:

class Neuro 
{ 
    public class Net 
    { 
     private Neuro _parent; 
     public Net(Neuro parent) 
     { 
     _parent = parent; 
     } 
     public void SomeMethod() 
     { 
      _parent.OtherMethod(); 
     } 
    } 

    public int OtherMethod() 
    { 
     return 123; 
    } 
} 
0

Penso che fare un'istanza della classe esterna in classe interna non è una buona opzione perché è possibile eseguire la logica di business sul costruttore della classe esterna. Rendere metodi o proprietà statici è l'opzione migliore. Se insisti a creare un'istanza di classe esterna piuttosto che dovresti aggiungere un altro parametro al contructor di classe esterno che non esegua la logica di business.

Problemi correlati