none
Singleton-Instanz einer Klasse erstellen RRS feed

  • Frage

  • Ich versuche zu erreichen, dass von einer selbstgeschriebenen Klasse nur eine einzige Instanz erstellt wird.

    Dazu habe ich Code-Beispiele aus dem internet versucht umzusetzen, etwa in der Form:

    public Class MyClass   
       private Shared myInstance as MyClass

    Public Shared Function GetInstance() As CAN2USB
            If myInstance Is Nothing Then
                myInstance = New CAN2USB
            End If
            Return myInstance
        End Function
    End Class

     

    Schon bisher musste der Verweis wie folgt gemacht werden:

    Dim WithEvents xxx as MyClass.MyClass

     

    Wenn ich die Empfehlungen bezüglich der Singleton-Geschichte richtig interpretiere, dann

    müsste ich den Verweis jetzt wie folgt machen:

    Dim WithEvents xxx as MyClass.MyClass.GetInstance()

    Allerdings wird mir beim Tippen nicht einmal die GetInstance-Methode angeboten. Warum aber ?

     

    Sonntag, 7. November 2010 10:48

Antworten

  • Hallo Nico,

    Ich versuche zu erreichen, dass von einer selbstgeschriebenen Klasse nur eine einzige Instanz erstellt wird.

    [...]

    Wenn ich die Empfehlungen bezüglich der Singleton-Geschichte richtig interpretiere, dann

    müsste ich den Verweis jetzt wie folgt machen:

    Dim WithEvents xxx as MyClass.MyClass.GetInstance()

    Allerdings wird mir beim Tippen nicht einmal die GetInstance-Methode angeboten. Warum aber ?

    Da ist einiges durcheinander. Zunächst ein Entwurf für Deine Singleton Klasse:

    Public Class CAN2USB
     Private Shared m_Instance As CAN2USB
     Private Shared m_SyncLock As New Object()
    
     ' CAN2USB Events
    
     Private Sub New()
    
     End Sub
    
     Private Shared Sub Initialize()
      SyncLock m_SyncLock
       If m_Instance Is Nothing Then
        m_Instance = New CAN2USB()
       End If
      End SyncLock
     End Sub
    
     Public Shared Function GetInstance() As CAN2USB
    
      If m_Instance Is Nothing Then
       Initialize()
      End If
    
      Return m_Instance
    
     End Function
    End Class

    Hier hattest Du in Deinem Beispiel eine Vermischung unterschiedlicher Klassenbezeichner und keinen privaten Konstruktor, womit die Klasse kein Singleton war, sondern weiterhin beliebig instantiierbar. Ferner war Dein Beispiel fehleranfällig im multithreaded Szenarien.

    Zu Deiner eigentlichen Frage, hier vermischst Du Deklaration und Methodenaufruf. Wenn Du es trennst, passt es:

    Public Class Form1
     Private WithEvents myCan As CAN2USB = CAN2USB.GetInstance()
    
     [...]
    End Class

    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Sonntag, 7. November 2010 11:44
    Moderator

Alle Antworten

  • Hallo Nico,

    Ich versuche zu erreichen, dass von einer selbstgeschriebenen Klasse nur eine einzige Instanz erstellt wird.

    [...]

    Wenn ich die Empfehlungen bezüglich der Singleton-Geschichte richtig interpretiere, dann

    müsste ich den Verweis jetzt wie folgt machen:

    Dim WithEvents xxx as MyClass.MyClass.GetInstance()

    Allerdings wird mir beim Tippen nicht einmal die GetInstance-Methode angeboten. Warum aber ?

    Da ist einiges durcheinander. Zunächst ein Entwurf für Deine Singleton Klasse:

    Public Class CAN2USB
     Private Shared m_Instance As CAN2USB
     Private Shared m_SyncLock As New Object()
    
     ' CAN2USB Events
    
     Private Sub New()
    
     End Sub
    
     Private Shared Sub Initialize()
      SyncLock m_SyncLock
       If m_Instance Is Nothing Then
        m_Instance = New CAN2USB()
       End If
      End SyncLock
     End Sub
    
     Public Shared Function GetInstance() As CAN2USB
    
      If m_Instance Is Nothing Then
       Initialize()
      End If
    
      Return m_Instance
    
     End Function
    End Class

    Hier hattest Du in Deinem Beispiel eine Vermischung unterschiedlicher Klassenbezeichner und keinen privaten Konstruktor, womit die Klasse kein Singleton war, sondern weiterhin beliebig instantiierbar. Ferner war Dein Beispiel fehleranfällig im multithreaded Szenarien.

    Zu Deiner eigentlichen Frage, hier vermischst Du Deklaration und Methodenaufruf. Wenn Du es trennst, passt es:

    Public Class Form1
     Private WithEvents myCan As CAN2USB = CAN2USB.GetInstance()
    
     [...]
    End Class

    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Sonntag, 7. November 2010 11:44
    Moderator
  • Hallo Nico,

    ergänzend zu Thorstens Antwort:

    Eine Implementation (entspricht Thorstens) und Diskussion findest Du in der Wikipedia:

    http://de.wikipedia.org/wiki/Singleton_%28Entwurfsmuster%29#Implementierung_in_Visual_Basic_.NET

    Eine weiterführende Diskussion zu weiteren Implentationmöglichkten gibt es bei Jon Skeet:
    http://csharpindepth.com/Articles/General/Singleton.aspx

    Der Beispielcode ist dort in C#, falls Probleme bei der Umsetzung melden.

    Gruß Elmar

    Sonntag, 7. November 2010 12:34
    Beantworter
  • Vielen Dank vorerst mal.

    Ich habe dies inzwischen umgesetzt und es scheint jetzt zu funktionieren. - Yipppppiiiiiiiie

    Montag, 8. November 2010 12:04