Singleton

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von StGo.

    Morgen zusammen,

    ich suche nach einer Lösung um ein Ojekt einer Klasse Projektweit zu verwenden. Dabei bin ich auf das Thema Singleton gestoßen. Ich frage mich nur warum ich auf die Set Methode meiner Klasse nicht zugreifen kann? Hat jemand eine Idee?

    Aufruf in der Main Dim MeinSingletonString = Singleton.Instance.GetTestString

    Singleton Klasse:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Singleton
    2. Private Shared MySingleton As Singleton
    3. Public Shared Property Instance() As Singleton
    4. Get
    5. If IsNothing(MySingleton) Then
    6. MySingleton = New Singleton
    7. End If
    8. Return MySingleton
    9. End Get
    10. Set(value As Singleton)
    11. End Set
    12. End Property
    13. Private _TestString As String
    14. Public Property GetSetTestString As String
    15. Get
    16. Return _TestString
    17. End Get
    18. Set(value As String)
    19. _TestString = value
    20. End Set
    21. End Property
    22. Private Sub TestStringFuellen() 'Beispielmethode
    23. _TestString = "Dies ist ein test zum Thema Singleton"
    24. End Sub
    25. End Class



    EDIT: Code angepasst

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „StGo“ ()

    Die ist Private (falls fu die Methode TestStringFuellen meinen solltest).
    Auch bei Singleton Klassen gilt das selbe wie bei "normalen" Klassen, dass diese mindestens Friend (im gemeinsamen Projekt) sein muss.
    Sonst halt Public.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Morgen,

    ohhh ich habe mich mit meiner Schreibweise selber überlistet. Das Private ist schon richtig. Ich will ja die Methode/Member in der Klasse Kapseln. Aber ich habe Getter und Setter als "GetTestString" bezeichnet. Man kann aber damit das member setzen und lesen.

    Ich änder das Beispiel. Dann hilft es eventuell auch anderen weiter.

    Danke

    EDIT: Habe den Code für das Verständnis geändert:

    Hier die Main:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Dim MeinSingletonString = Singleton.Instance.GetSetTestString
    4. Singleton.Instance.GetSetTestString = "geändert"
    5. Dim MeinSingletonString2 = Singleton.Instance.GetSetTestString
    6. End Sub
    7. End Class


    Und hier die Singleton-Klasse:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Singleton
    2. Private Sub New()
    3. _TestString = "Dies ist ein test zum Thema Singleton"
    4. End Sub
    5. Private Shared MySingleton As Singleton
    6. Public Shared Property Instance() As Singleton
    7. Get
    8. If IsNothing(MySingleton) Then
    9. MySingleton = New Singleton
    10. End If
    11. Return MySingleton
    12. End Get
    13. Set(value As Singleton)
    14. End Set
    15. End Property
    16. Private _TestString As String
    17. Public Property GetSetTestString As String
    18. Get
    19. Return _TestString
    20. End Get
    21. Set(value As String)
    22. _TestString = value
    23. TestStringFuellen()
    24. End Set
    25. End Property
    26. Private Sub TestStringFuellen() 'Beispielmethode
    27. _TestString = "Jetzt ist der String " & _TestString
    28. End Sub
    29. End Class


    Ich denke das kann man verstehen. Anscheinend war ich heute Morgen noch nicht wach :)

    Hatte heute Morgen noch kein KATA (Robert C. Martin) gemacht ;)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „StGo“ ()

    Für was hast du die Methode TestStringFuellen() ?
    Wenn ich der Property GetSetTestString einen Wert zuweise (zB.: "Test1") ist eigentlich der Wert:" Jetzt ist der String Test1" gespeichert.
    _TestString wird beim Zuweisen der Property 2 mal ein Wert zugewiesen (einmal über den Setter der Property -> _TestString = value und einmal über TestStringFuellen()).

    Lass einfach die Property und entferne diese TestStringFuellen Methode.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten

    StGo schrieb:

    selber überlistet
    So isses.

    VB.NET-Quellcode

    1. Dim MeinSingletonString = Singleton.Instance.GetSetTestString
    2. Dim si1 = New Singleton
    3. si1.GetSetTestString = "Bla1"
    4. Dim si2 = New Singleton
    5. si2.GetSetTestString = "Bla Bla2"
    6. MessageBox.Show(si1.GetSetTestString & Environment.NewLine & si2.GetSetTestString & Environment.NewLine & MeinSingletonString)
    Mach in der Klasse Singleton das New explizit Private:

    VB.NET-Quellcode

    1. Private Sub New()
    2. _TestString = "Dies ist ein test zum Thema Singleton"
    3. End Sub

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @fichz

    Klar kann man über den Setter eine Zuweisung machen. Aber man möchte eventuell den Wert Formatieren oder sonst was damit tun ohne die Methode nach aussen zugänglich zu machen. So war der gedanke des beispiels. Falls ich deine Frage/Einwand richtig verstehe.
    Ansonsten schreib doch ein kurzes Beispiel. Mich würde schon interessieren wie du es mit Properties hälst.

    Gruß
    Ich würde es aus dem Bauchgefühl so machen:

    VB.NET-Quellcode

    1. Module Module1
    2. Sub Main()
    3. Dim c As New Test() With {.Test = "Teststring"}
    4. Console.WriteLine(c.Test)
    5. Console.WriteLine(c.TestHaltAnders)
    6. Console.ReadLine()
    7. End Sub
    8. End Module
    9. Class Test
    10. Private _Test As String
    11. Public Property Test() As String
    12. Get
    13. Return _Test
    14. End Get
    15. Set(ByVal value As String)
    16. _Test = value
    17. End Set
    18. End Property
    19. Public ReadOnly Property TestHaltAnders() As String
    20. Get
    21. Return "Modifiziert " & _Test
    22. End Get
    23. End Property
    24. End Class


    So wie du es in deinem Beispiel hast wird der String IMMER falsch verändert
    Nämlich so:
    singleton.GetSetTestString = "Test"
    daraus wird:
    -> _TestString = value (SetTeil)
    _TestString hat den Wert "Test"
    -> Im Setter wird IMMER TestStringFuellen() aufgerufen
    _TestString = "Jetzt ist der String " & _TestString
    _TestString hat den Wert "Jetzt ist der String Test"

    In deinem Fall hält die Variable _TestString NIE den gesetzten Wert sondern immer einen modifizierten.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten