2013-05-01 1 views
8

У меня есть ошибкане удается получить доступ к нестатическому члену внешнему виду с помощью вложенного типа

не удается получить доступ к нестатическому члену внешнего типу «Project.Neuro» с помощью вложенного типа «Project.Neuro.Net '

с кодом, как это (упрощенный):

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

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

я могу перенести проблемный метод класса Neuro.Net, но мне нужен этот метод снаружи.

Im вид объектного программирования новичок.

Заранее спасибо.

+1

Кажется довольно очевидным - 'OtherMethod' является членом другого типа. Тот факт, что он вложен, не означает, что методы _inherited_. –

+1

См. Этот ответ SO для получения дополнительной информации: http://stackoverflow.com/a/5393472/1451531 – Splendor

ответ

16

Проблема состоит в том, что вложенных классов не получены классов, поэтому методы внешнего класса не наследуются .

Некоторые опции

  1. Сделать метод static:

    class Neuro 
    { 
        public class Net 
        { 
         public void SomeMethod() 
         { 
          int x = Neuro.OtherMethod(); 
         } 
        } 
    
        public static int OtherMethod() 
        { 
         return 123; 
        } 
    } 
    
  2. Используйте наследование вместо гнездовых классов:

    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. Создать экземпляр Neuro:

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

Я сделал свой метод статическим. Теперь им интересно, как мне реорганизовать мои классы ... может быть, это хорошая тема для другого вопроса. – Kamil

2

вам нужно создать экземпляр объекта типа Neuro где-то в вашем коде и вызвать OtherMethod на него, так как OtherMethod не является статическим методом. Создаете ли вы этот объект внутри SomeMethod или передаете его в качестве аргумента, который зависит от вас. Что-то вроде:

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

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

в качестве альтернативы, вы можете сделать OtherMethod статичны, который позволит вам вызвать из SomeMethod, как вы в настоящее время.

+0

OK. Благодарю. Теперь я думаю, что мне нужно реорганизовать мой код ... – Kamil

+0

Хотел бы я принять 2 ответа ... – Kamil

+0

@ Kamil не беспокойтесь об этом, D ответ Стэнли в любом случае более полный. – vlad

0

Даже если класс вложен в другой класс, он до сих пор не ясно, какой экземпляр переговоров внешнего класса, к которому экземпляр внутреннего класса. Я мог бы создать экземпляр внутреннего класса и передать его другому экземпляру внешнего класса. Поэтому для вызова этоговам понадобится конкретный экземпляр.

Вы можете передать экземпляр по созданию:

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

Я думаю, что делает экземпляр внешнего класса во внутреннем классе не является хорошим выбором, потому что вы можете выполнения бизнес-логики на конструктор внешнего класса. Создание статических методов или свойств - лучший вариант. Если вы настаиваете на создании экземпляра внешнего класса, вы должны добавить другой параметр для внешнего класса, чтобы не выполнять бизнес-логику.

Смежные вопросы