2013-05-01 30 views
8

Tôi có lỗiKhông thể truy cập vào một thành viên không tĩnh của loại hình ngoài thông qua kiểu lồng nhau

Không thể truy cập vào một thành viên không tĩnh của loại ngoài 'Project.Neuro' qua loại lồng nhau 'Project.Neuro.Net '

với mã như thế này (giản thể):

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

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

tôi có thể di chuyển phương pháp có vấn đề để lớp Neuro.Net, nhưng tôi cần phương pháp này bên ngoài.

Im loại người mới lập trình khách quan.

Xin cảm ơn trước.

+1

Có vẻ khá rõ ràng - 'OtherMethod' là thành viên của một loại khác. Thực tế là nó lồng nhau không có nghĩa là các phương thức được _inherited_. –

+1

Xem câu trả lời SO này để biết thêm thông tin: http://stackoverflow.com/a/5393472/1451531 – Splendor

Trả lời

16

Vấn đề là lồng nhau lớp không có nguồn gốc lớp, vì vậy phương pháp trong các lớp bên ngoài là không thừa hưởng.

Một số tùy chọn là

  1. Tận dụng phương pháp static:

    class Neuro 
    { 
        public class Net 
        { 
         public void SomeMethod() 
         { 
          int x = Neuro.OtherMethod(); 
         } 
        } 
    
        public static int OtherMethod() 
        { 
         return 123; 
        } 
    } 
    
  2. Sử dụng thừa kế thay vì các lớp học làm tổ:

    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. Tạo một thể hiện của 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

Tôi đã đặt phương thức tĩnh của mình. Bây giờ im tự hỏi làm thế nào tôi sẽ tổ chức lại các lớp học của tôi ... có thể là chủ đề tốt của nó cho một câu hỏi khác. – Kamil

2

bạn cần khởi tạo đối tượng thuộc loại Neuro ở đâu đó trong mã của bạn và gọi OtherMethod trên đó, vì OtherMethod không phải là phương pháp tĩnh. Cho dù bạn tạo đối tượng này bên trong số SomeMethod hoặc chuyển đối tượng đó làm đối số cho bạn thì tùy thuộc vào bạn. Một cái gì đó như:

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

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

cách khác, bạn có thể làm OtherMethod tĩnh, mà sẽ cho phép bạn gọi nó là từ SomeMethod như bạn hiện đang có.

+0

OK. Cảm ơn. Bây giờ tôi nghĩ rằng tôi nên tổ chức lại mã của tôi ... – Kamil

+0

Tôi muốn tôi có thể chấp nhận 2 câu trả lời ... – Kamil

+0

@Kamil đừng lo lắng về nó, câu trả lời của D Stanley là hoàn thành hơn anyway. – vlad

0

Mặc dù lớp được lồng trong một lớp học, nó vẫn là không rõ ràng mà thể hiện của các cuộc đàm phán lớp bên ngoài mà thể hiện của lớp bên trong. Tôi có thể tạo một thể hiện của lớp bên trong và chuyển nó tới một thể hiện khác của lớp bên ngoài. Vì vậy, bạn cần một cá thể cụ thể để gọi số OtherMethod() này.

Bạn có thể vượt qua các ví dụ trên tạo:

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

Tôi nghĩ rằng làm một thể hiện của lớp bên ngoài trong lớp bên trong không phải là một lựa chọn tốt vì bạn có thể thực hiện logic kinh doanh trên constructor lớp bên ngoài. Làm cho phương pháp tĩnh hoặc thuộc tính là lựa chọn tốt hơn. Nếu bạn nhấn mạnh việc tạo một thể hiện của lớp bên ngoài hơn là bạn nên thêm một tham số khác vào lớp bên ngoài contructor mà không thực thi logic nghiệp vụ.

Các vấn đề liên quan