2009-07-09 21 views
26

Có thể truy cập vào một thành viên cha mẹ trong một lớp con ...C# Nested class Truy cập Member Chánh

class MainClass { 
    class A { Whatever } 

    class B { 
    List<A> SubSetList; 

    public void AddNewItem(A NewItem) { 
     Check MasterListHere ???? 
    } 
    } 

    List<A> MasterList; 
} 

... Vì vậy, lớp học chính của tôi sẽ có một danh sách tổng thể. Nó cũng sẽ có một loạt các trường hợp B. Trong mỗi trường hợp của B, tôi muốn thêm A mới vào B cụ thể, nhưng chỉ khi chúng tồn tại trong Danh sách chính. Tôi đã chơi với việc tạo ra MasterList tĩnh và nó hoạt động ... cho đến khi tôi có nhiều hơn một thể hiện của MainClass ... mà tôi sẽ có.

Tôi có thể chuyển một tham chiếu đến MasterList cho mỗi thể hiện của B, nhưng cuối cùng tôi sẽ có nhiều "MasterLists" và tôi không muốn phải vượt qua rất nhiều tài liệu tham khảo nếu tôi không phải.

Trả lời

22

Bạn có thể sử dụng một cái gì đó như thế này:


class B { 
    private MainClass instance; 

    public B(MainClass instance) 
    { 
     this.instance = instance; 
    } 

    List SubSetList; 

    public void AddNewItem(A NewItem) { 
     Check MasterListHere ???? 
    } 
    } 
1

Bất kể bạn tổ chức lớp B trong lớp A, bất kỳ trường hợp đã cho nào của A sẽ vẫn cần phải biết về cá thể của B mà nó được giữ bởi. Vì vậy, bạn có thể muốn khởi tạo A với tham chiếu đến B và giữ nó trong một trường. Điều này có khả năng bao gồm un-nesting nó.

+0

Tôi cũng xem xét điều đó ... Có một công cụ sửa đổi truy cập sẽ giới hạn quyền truy cập chỉ vào các lớp lồng nhau không? – Rob

+0

Vâng, một cách là đặt tất cả các cấu trúc dữ liệu này vào trong hội đồng của riêng chúng và sử dụng nội bộ thay vì riêng tư. –

+0

tôi đã xem xét điều đó, nhưng nó không ngăn cản các lớp khác truy cập vào danh sách này. Nó không phải là siêu quan trọng, nhưng tôi muốn điều này là sạch sẽ nhất có thể ... – Rob

5

Với định nghĩa của bạn, các trường hợp class B có thể truy cập các phương thức riêng và các trường tĩnh của class MainClass.

+3

Nhưng bạn vẫn cần phải chuyển một tham chiếu đến dụ – Jeremy

+1

@Jeremy: bắt gặp tôi trong khi chỉnh sửa :) –

1

Có, nhưng bạn sẽ cần phải có một tham chiếu đến thể hiện của MainClass từ bên trong bạn thể hiện của B.

Bạn đã nghĩ đến việc tái làm việc lớp học của bạn một chút? Tôi có phương thức AddNewItem trong B, bạn có thể có nó trong MainClass. Bằng cách đó, sẽ dễ dàng kiểm tra MasterList từ bên trong MainClass.

1

Điều này có thể làm việc cho bạn:

public void AddNewItem(A newItem, Func<A, bool> checkForItemInMasterList) 
{ 
    if (checkForItemInMasterList.Invoke(newItem) 
     SubList.Add(newItem); 
} 

Sau đó bạn sẽ có một cái gì đó trong MainClass bạn để sử dụng các phương pháp như thế này:

public void AddItem(A newItem) 
{ 
    new B().AddNewItem(newItem, x => MasterList.Contains(x)); 
} 

Để tóm tắt nội dung có thể trông giống như sau:

class MainClass { 
    class A { Whatever } 

    class B { 
    List<A> SubSetList; 

    public void AddNewItem(A newItem, Func<A, bool> checkForItemInMasterList) 
    { 
     if (checkForItemInMasterList.Invoke(newItem) 
      SubList.Add(newItem); 
    } 
    } 

    //I don't know how you're adding items to instances of B. 
    //This is purely speculative. 
    public void AddItem(A newItem) 
    { 
     new B().AddNewItem(newItem, x => MasterList.Contains(x)); 
    } 

    List<A> MasterList; 
} 
+0

Vấn đề là tôi sẽ có nhiều phiên bản B để tôi thêm một mục vào ... – Rob

+0

Tôi ' m xem xét làm một cái gì đó tương tự như thế này, nhưng bao gồm cả một tham chiếu đến B là tốt .. vì vậy công cộng void AddItem (danh sách B, A mục) {} .. – Rob

+0

@Rob nhiều trường hợp là tốt trong trường hợp này, bạn chỉ cần thay đổi cách bạn thêm các mục trong MainClass của bạn, nhưng theo cách đó bạn không phải lo lắng về B biết về MasterList của bạn. – Joseph

14

Trong C# không có tham chiếu ngầm định đến thể hiện của lớp bao quanh, vì vậy bạn cần chuyển tham chiếu đó, và cách điển hình để làm điều này là thông qua hàm tạo của lớp lồng nhau.

+4

Đây là một sự xấu hổ, bởi vì nó có nghĩa là một lớp không phải là một không gian tên, không giống như trong C++. – jwg