2012-06-07 10 views
5

Chcę utworzyć klasę zagnieżdżoną, która może być widoczna tylko dla instancji i utworzona z klasy nadrzędnej.
Ale chcę również móc użyć instancji klasy zagnieżdżonej za pomocą publicznej zmiennej klasy nadrzędnej.
Próbowałem uczynić klasę zagnieżdżoną prywatną lub czyniąc konstruktor klasy zagnieżdżonej prywatną, ale nie skompiluje.
Czy można to zrobić w .NET?Prywatne zagnieżdżone klasy

To kompiluje i działa, ale zagnieżdżone klasy mogą być wykorzystywane przez nikogo:

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

Jedyną rzeczą, która jest wyjątkowa w przypadku klasy zagnieżdżonej, jest możliwość uzyskania dostępu do prywatnych i chronionych członków klasy zawierającej (pod warunkiem, że ma ona odniesienie do jednego). Czy to jest funkcja klasy zagnieżdżonej, o którą się troszczyłeś, czy próbujesz zrobić coś innego? –

+0

Głównie próbuję zachować klasę zagnieżdżoną z Intellisense, a także mieć ubezpieczenie, którego nie można utworzyć, z wyjątkiem klasy nadrzędnej. – mcu

+0

Dla mnie zagnieżdżone definicje klas prywatnych powinny być dostępne tylko dla klasy przechowującej, tak samo jak zmienne prywatne, ponieważ są prywatne dla tej klasy. Ale jeśli klasa holdingowa tworzy instancję i przypisuje ją do publicznej zmiennej wewnątrz klasy holdingowej, instancja powinna być dostępna dla każdego jako pole klasy hold. To po prostu wydaje mi się bardzo naturalne zachowanie obiektu. No cóż. – mcu

Odpowiedz

6

Zazwyczaj klasa zagnieżdżona implementuje interfejs lub dziedziczy inną klasę, a interfejs/klasa bazowa jest narażony. Jest to przydatne, gdy chcesz ukryć implementację w klasie nadrzędnej. Coś takiego:

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

To działa w większości przypadków, dziękuję. Ma tylko jeden niedostatek, który znalazłem. Jeśli klasa zagnieżdżona ma pola publiczne, nie mogę ich używać przez interfejs, chyba że zaimplementuję je jako właściwości. – mcu

+0

Również przeniosłem interfejs wewnątrz klasy nadrzędnej. To sprawiło, że jest bardziej samowystarczalny. – mcu

3

Nie można mieć prywatny klasy zagnieżdżone, które są również narażone za pośrednictwem interfejsu publicznego.

Jest to jedna z nich lub propozycja - klasa zagnieżdżona jest prywatna lub jej nie ma.

Opcją jest zadeklarowanie interfejsu z kontraktem, który ma być implementowany przez klasę zagnieżdżoną (z niektórymi narzędziami do refaktoryzacji można wyodrębnić interfejs z klasy) i udostępnić interfejs, zachowując klasę zagnieżdżoną jako prywatną.

0

Jeśli jesteś po prostu stara się utrzymać klientów z korzystania z obiektu na zewnątrz biblioteki po prostu zrobić konstruktora friend. W ten sposób tylko kod w twoim Zgromadzeniu może stworzyć obiekt.

+0

Hmm, próbowałem użyć prywatnego konstruktora, ale wtedy klasa nadrzędna też nie mogła go utworzyć. – mcu

+0

Użyj przyjaciela, a następnie. Będę edytować moją odpowiedź. – tcarvin

+0

Przyjaciel ogranicza dostępność do zespołu, więc może lub nie może działać dla OP –

Powiązane problemy