2013-05-01 71 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類,但我需要以外這種方法。

我是一種客觀的編程新手。

在此先感謝。

+1

似乎很明顯 - 'OtherMethod'是另一種類型的成員。它嵌套的事實並不意味着這些方法是_inherited_。 – 2013-05-01 15:19:06

+1

看到這個答案的更多信息:http://stackoverflow.com/a/5393472/1451531 – Splendor 2013-05-01 15:21:31

回答

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 2013-05-01 15:44:22

2

您需要實例Neuro類型某處的對象在你的代碼,並呼籲它OtherMethod,因爲OtherMethod不是一個靜態方法。無論您在SomeMethod之內創建此對象,還是將其作爲參數傳遞給您,都取決於您。喜歡的東西:

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

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

或者,您也可以使OtherMethod靜態的,這將讓你從SomeMethod稱其爲您當前所在。

+0

好的。謝謝。現在我想我應該重新組織我的代碼... – Kamil 2013-05-01 15:24:57

+0

我希望我能接受2個答案... – Kamil 2013-05-01 15:32:33

+0

@Kamil不用擔心,D斯坦利的答案無論如何都是比較完整的。 – vlad 2013-05-01 15:33:06

0

即使類嵌套在另一個類中,它仍然是不明顯的內部類的哪個哪個的外部類實例的會談情況。我可以創建一個內部類的實例並將其傳遞給另一個外部類的實例。 因此,您需要特定實例才能調用此OtherMethod()

您可以通過創建實例:

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

我覺得做在內部類外部類的一個實例是不是一個好的選擇,因爲你可以在外部類的構造函數執行業務邏輯。製作靜態方法或屬性是更好的選擇。如果堅持要創建外部類的實例,則應該將另一個參數添加到不執行業務邏輯的外部類構造器中。

相關問題