2012-06-07 12 views
5

Ich möchte eine verschachtelte Klasse erstellen, die nur für die Elternklasse sichtbar und instanziiert werden kann.
Aber ich möchte auch eine Instanz der geschachtelten Klasse über eine öffentliche Variable der Elternklasse verwenden können.
Ich habe versucht, die verschachtelte Klasse privat zu machen, oder den Konstruktor der verschachtelten Klasse privat zu machen, aber es wird nicht kompiliert.
Ist es möglich, dies in .NET zu tun?Private verschachtelte Klassen

Dies kompiliert und funktioniert, aber die verschachtelte Klasse kann von jedem verwendet werden:

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

Das Besondere an einer geschachtelten Klasse ist, dass sie auf die privaten und geschützten Member der enthaltenen Klasse zugreifen kann (vorausgesetzt, sie hat einen Verweis auf eine). Ist das die Funktionalität der geschachtelten Klasse, die Sie interessiert haben oder wollten Sie etwas anderes tun? –

+0

Meistens versuche ich, die verschachtelte Klasse aus Intellisense herauszuhalten, und habe auch eine Versicherung, dass sie nur von der Elternklasse instanziiert werden kann. – mcu

+0

Für mich sollten verschachtelte private Klassendefinitionen nur für die Halteklasse verfügbar sein, genau wie private Variablen, da sie für diese eine Klasse privat sind. Wenn die Halteklasse sie jedoch instanziiert und einer öffentlichen Variablen innerhalb der Halteklasse zuordnet, sollte die Instanz für jeden als ein Feld der Halteklasse zugänglich sein. Es scheint mir ein sehr natürliches Objektverhalten zu sein. Naja. – mcu

Antwort

6

In der Regel implementiert die private geschachtelte Klasse eine Schnittstelle oder erbt eine andere Klasse, und die Schnittstelle/Basisklasse wird verfügbar gemacht. Dies ist nützlich, wenn Sie die Implementierung in der übergeordneten Klasse ausblenden möchten. Etwas wie folgt aus:

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

Das funktioniert größtenteils, danke. Es hat nur einen Mangel, den ich gefunden habe. Wenn die verschachtelte Klasse öffentliche Felder hat, kann ich sie nicht über eine Schnittstelle verwenden, wenn ich sie nicht als Eigenschaften implementiere. – mcu

+0

Ich habe auch die Schnittstelle in die Elternklasse verschoben. Es machte es mehr in sich geschlossen. – mcu

3

Sie haben keine private verschachtelte Klasse, die auch über eine öffentliche Schnittstelle ausgesetzt ist.

Es ist entweder eine oder eine Aussage - entweder ist die verschachtelte Klasse privat oder nicht.

Eine Option besteht darin, eine Schnittstelle mit dem Vertrag zu deklarieren, den die verschachtelte Klasse implementieren soll (mit einigen Refactoring-Tools können Sie eine Schnittstelle aus einer Klasse extrahieren) und die Schnittstelle offen legen, während die verschachtelte Klasse privat bleibt.

0

Wenn Sie versuchen, nur Kunden zu halten von Ihrem Objekt außerhalb Ihrer Bibliothek dann einfach den Konstruktor friend machen. Auf diese Weise kann nur Code in Ihrer Assembly das Objekt erstellen.

+0

Hmm, ich habe versucht, einen privaten Konstruktor zu verwenden, aber die Elternklasse konnte es auch nicht instanziieren. – mcu

+0

Verwenden Sie dann Freund. Ich werde meine Antwort bearbeiten. – tcarvin

+0

Freund beschränkt die Zugänglichkeit für die Baugruppe, so dass es möglicherweise für das OP –

Verwandte Themen