2009-05-11 19 views
13

Giả sử chúng ta có một lớp InnerClass với các thuộc tính và getter/setter. Chúng tôi cũng có một lớp OuterClass chứa InnerClass.getter và setter cho lớp trong lớp C#

ví dụ:

class InnerClass 
{ 
    private int m_a; 
    private int m_b; 

    public int M_A 
    { 
     get 
     { 
      return m_a; 
     } 
     set 
     { 
      m_a = value; 
     } 
    } 
} 

class OuterClass 
{ 
    private InnerClass innerClass 
} 

Làm thế nào tôi sẽ thực hiện một getter và setter đúng cho thành viên innerClass của OuterClass?

Cảm ơn trước!

+0

"bộ" phải là {m_a = giá trị;} –

+0

bạn đã có đại diện để sửa chữa mà bạn biết;) – annakata

Trả lời

24

Cú pháp sẽ không khác biệt chút nào. Chỉ cần ...

public InnerClass InnerClass 
{ 
    get { return innerClass; } 
    set { innerClass = value; } 
} 

Bằng cách này, nếu bạn đang sử dụng C# trong .NET 3.5, bạn có thể sử dụng tính năng tạo thuộc tính tự động nếu tất cả những gì bạn có là một thuộc tính đơn giản chỉ đọc và ghi lưu trữ (như bạn đã ở trên). Các sytax là tương tự như của một tài sản trừu tượng:

public InnerClass InnerClass { get; set; } 

này sẽ tự động tạo ra một thành viên riêng để lưu trữ, sau đó đọc từ nó trong get và viết nó trong set.

2
public InnerClass InnerClass 
    { 
     get 
     { 
      return innerClass; 
     } 
     set 
     { 
      innerClass = value; 
     } 
    } 
0

Tùy thuộc vào cách lớp bên trong hoạt động. Lớp ngoài có thể cần phải "sở hữu" các lớp bên trong, trong trường hợp này:

public InnerClass InnerClass{ 
    get{ return innerClass; } 
    set{ innerClass.CopyFrom(value); /* Pseudo method call */ } 
} 

Bằng cách làm nó theo cách này, bạn ngăn chặn mã bên ngoài từ thao tác dụ trừ một cách rõ ràng thông qua OuterClass ..

+0

Không thực sự, vì bạn đang trả lại phiên bản trong trình khởi động. Cách duy nhất thực sự để làm điều này (và cách tiếp cận này là một chút mùi ...) sẽ được sử dụng cùng một phương pháp CopyFrom để trả về một thể hiện mới trong getter. –

+0

Tôi nghĩ bạn hiểu lầm. Vấn đề là bạn có thể sửa đổi cá thể, nhưng bạn phải làm điều đó một cách rõ ràng thông qua cá thể của OuterClass. Ví dụ OuterClass.InnerClass foo = new OuterClass.InnerClass(); foo.M_A = 1; outerInstance.InnerClass = foo; //outerInstance.InnerClass.M_A = 1 foo.SomeProperty = 2; // outerInstance.InnerClass.M_A vẫn bằng 1 outerInstance.InnerClass = foo; //outerInstance.InnerClass.M_A bằng 2 – James

0

Nếu bạn có nghĩa là truy cập các thành viên lớp bên trong mà không để lộ chính lớp bên trong, bạn có thể sử dụng mã sau đây. Nếu bạn chỉ muốn phơi bày this.innerClass, không có sự khác biệt về cách bạn phơi bày các trường của InnerClass.

class OuterClass 
{ 
    private InnerClass innerClass 

    public int M_A 
    { 
     get 
     { 
      if (this.innerClass != null) 
      { 
       return this.innerClass.M_A; 
      } 
      else 
      { 
       throw new InvalidOperationException(); 
      } 
     } 
     set 
     { 
      if (this.innerClass != null) 
      { 
       this.innerClass.M_A = value; 
      } 
      else 
      { 
       throw new InvalidOperationException(); 
      } 
     } 
    } 
} 
+0

Tôi không chắc chắn cách áp dụng điều này trừ khi tôi bỏ lỡ một phần câu hỏi ... đó là những gì anh ta yêu cầu? –

+0

Chỉ cần tò mò - tại sao bạn sẽ ném một ngoại lệ hoạt động không hợp lệ trên getter? Tôi hiểu tại sao bạn làm điều này trong setter, nhưng bạn sẽ không cho rằng getter là thụ động? – BenAlabaster

+0

Tôi đọc câu hỏi "[...] getter và setter cho thành viên innerClass của OuterClass?" với một bổ sung "s" là "[...] innerClass thành viên của OuterClass?", nhưng regonized rằng chỉ sau khi kết thúc câu trả lời của tôi. –

21

Cách thanh lịch nhất để làm điều này là sử dụng thu khí ngầm và setters:

class InnerClass 
{ 
    public int a{ get; set; } 
    public int b{ get; set; } 
} 

class OuterClass 
{ 
    public InnerClass innerClass{ get; set; } 
} 

Đây là ngầm giống như:

class InnerClass 
{ 
    private int _a; 
    public int a 
    { 
     get 
     { 
      return _a; 
     } 
     set 
     { 
      _a = value; 
     } 
    } 

    private int _b; 
    public int b 
    { 
     get 
     { 
      return _b; 
     } 
     set 
     { 
      _b = value; 
     } 
    } 
} 

class OuterClass 
{ 
    private InnerClass _innerClass; 
    public InnerClass innerClass 
    { 
     get 
     { 
      return _innerClass; 
     } 
     set 
     { 
      _innerClass = value; 
     } 
    } 
} 

Hai định nghĩa là ngầm cùng - trừ đi một vài lần nhấn phím. Trong ví dụ đầu tiên, trình biên dịch sẽ thực hiện các trường riêng tư cần thiết đằng sau hậu trường để bạn không phải làm như vậy. Thứ hai, tuy nhiên cho phép bạn kiểm soát nhiều hơn những gì đang xảy ra.

+0

+1 cho getters tiềm ẩn và setters – BobTheBuilder

+2

... Điều này khác với câu trả lời của tôi như thế nào? –

+1

Ngoài ra, anh ta không đưa ra dấu hiệu của phiên bản C# /. NET mà anh ta đang sử dụng. Các thuộc tính ngầm là một phần của .NET 3.5/C# 3.0. –