Benutzer mit den meisten Antworten
Singleton-Instanz einer Klasse erstellen

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 ClassSchon 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 ?
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- Als Antwort vorgeschlagen Elmar BoyeEditor Sonntag, 7. November 2010 12:34
- Als Antwort markiert Robert BreitenhoferModerator Montag, 8. November 2010 12:09
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- Als Antwort vorgeschlagen Elmar BoyeEditor Sonntag, 7. November 2010 12:34
- Als Antwort markiert Robert BreitenhoferModerator Montag, 8. November 2010 12:09
-
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.aspxDer Beispielcode ist dort in C#, falls Probleme bei der Umsetzung melden.
Gruß Elmar