2012-06-07 74 views
5

Tôi muốn tạo một lớp lồng nhau chỉ có thể hiển thị và được hiển thị từ lớp cha.
Nhưng tôi cũng muốn có thể sử dụng một thể hiện của lớp lồng nhau thông qua một biến công khai của lớp cha.
Tôi đã cố gắng đặt lớp lồng nhau là riêng tư hoặc đặt hàm tạo của lớp lồng nhau là riêng tư, nhưng nó sẽ không biên dịch.
Có thể thực hiện việc này trong .NET không?Các lớp lồng nhau riêng

này biên dịch và các công trình, nhưng các lớp lồng nhau có thể được sử dụng bởi bất cứ ai:

Public Class OuterClass 
     Public X As Integer = 123 
     Public NestedClassInstance As New NestedClass(Me) 

     Public Class NestedClass 
      Private Parent As OuterClass 

      Public Sub New(ByVal _Parent As OuterClass) 
       Parent = _Parent 
      End Sub 

      Public Sub GetParentX() 
       Debug.WriteLine("X = " & Parent.X.ToString) 
      End Sub 
     End Class 
    End Class 

    Sub Main() 
     Dim OuterClassInstance As New OuterClass 
     OuterClassInstance.NestedClassInstance.GetParentX() 
    End Sub 
+0

Điều duy nhất đặc biệt về lớp lồng nhau là nó có thể truy cập các thành viên riêng tư và được bảo vệ của lớp chứa (miễn là nó có tham chiếu đến một). Đây có phải là chức năng của lớp lồng nhau mà bạn quan tâm hoặc bạn đang cố gắng làm điều gì khác không? –

+0

Chủ yếu là tôi đang cố gắng giữ lớp lồng nhau ra khỏi Intellisense, và cũng có một bảo hiểm mà nó không thể được khởi tạo trừ lớp cha. – mcu

+0

Với tôi, các định nghĩa lớp riêng tư lồng nhau chỉ nên có sẵn cho lớp đang nắm giữ, giống như các biến riêng tư, ở chỗ chúng là riêng tư với một lớp đó. Nhưng nếu lớp giữ instantiates nó và gán nó vào một biến công khai bên trong lớp đang nắm giữ, instance sẽ được truy cập đến bất cứ ai như là một trường của lớp đang nắm giữ. Nó có vẻ giống như một hành vi đối tượng rất tự nhiên đối với tôi. Oh well. – mcu

Trả lời

6

Thông thường lớp lồng nhau Riêng tư thực hiện giao diện hoặc kế thừa một lớp khác và lớp giao diện/cơ sở được hiển thị. Điều này rất hữu ích khi bạn muốn ẩn việc triển khai cho lớp cha. Một cái gì đó như thế này:

Module EntryPoint 
    Sub Main() 
     Dim OuterClassInstance As New OuterClass 
     OuterClassInstance.NestedClassInstance.GetParentX() 
    End Sub 
End Module 

Public Class OuterClass 
    Public X As Integer = 123 
    Public NestedClassInstance As ISomeImplementation = New NestedClass(Me) 

    Private Class NestedClass 
     Implements ISomeImplementation 
     Private Parent As OuterClass 

     Public Sub New(ByVal _Parent As OuterClass) 
      Parent = _Parent 
     End Sub 

     Public Sub GetParentX() Implements ISomeImplementation.GetParentX 
      Debug.WriteLine("X = " & Parent.X.ToString) 
     End Sub 
    End Class 
End Class 

Public Interface ISomeImplementation 
    Sub GetParentX() 
End Interface 
+0

Điều đó làm việc cho hầu hết các phần, cảm ơn. Nó chỉ có một sự thiếu hụt mà tôi đã tìm thấy. Nếu lớp lồng nhau có trường công khai, tôi không thể sử dụng chúng thông qua giao diện trừ khi tôi triển khai chúng làm thuộc tính. – mcu

+0

Tôi cũng đã di chuyển giao diện bên trong lớp cha. Nó làm cho nó độc lập hơn. – mcu

3

Bạn không thể có một lớp lồng nhau tin rằng cũng được tiếp xúc thông qua một giao diện công cộng.

Đây là một trong hai hoặc đề xuất - hoặc lớp lồng nhau là riêng tư hoặc không phải là lớp lồng nhau.

Tùy chọn là khai báo giao diện với hợp đồng bạn muốn lớp lồng nhau triển khai (với một số công cụ tái cấu trúc bạn có thể trích xuất giao diện từ lớp) và hiển thị giao diện, trong khi vẫn giữ riêng lớp lồng nhau.

0

Nếu bạn chỉ cố gắng giữ khách hàng sử dụng đối tượng bên ngoài thư viện của bạn thì chỉ cần tạo hàm tạo friend. Bằng cách đó chỉ có mã trong hội của bạn mới có thể tạo đối tượng.

+0

Hmm, tôi đã thử sử dụng một hàm tạo riêng, nhưng sau đó lớp cha không thể khởi tạo nó. – mcu

+0

Sử dụng bạn bè sau đó. Tôi sẽ chỉnh sửa câu trả lời của mình. – tcarvin

+0

người bạn giới hạn khả năng truy cập vào hội đồng, vì vậy nó có thể hoặc có thể không hoạt động cho OP –

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