none
Variabler Objektaufruf RRS feed

  • Frage

  • Liebe Community

    Nachdem ich wieder die VB-Programmierung aufgenommen habe, stehe ich bei dieser Problemstellung auf dem Schlauch:

    Abhängig von einer Benutzereingabe (Click, etc.) wird ein Objekt der Hero-Klasse erzeugt, entweder Hero1, Hero2 oder Hero3. In diesem Beispiel wird Hero1 instanziert. Das gesamte Programm soll sich grundsätzlich daran ausrichten, welches Objekt erzeugt wurde. Damit aber nicht bei jedem Schritt eine Select-Case-Verzweigung durchgeführt werden muss, soll in einer String-Variabel (HeroNR) gespeichert werden, welcher Held erzeugt wurde. Dabei geht es in erster Linie nicht um reine Bequemlichkeit, sondern darum, dass das Programm schnell sehr unübersichtlich werden würde, hätte der User eine grössere Auswahl.

    Public Class Hero

    Dim HP As Integer

    End Class

    Public Class MainForm

    Dim HeroNR As String Dim Hero1 As New Hero() With {.HP = "250"} HeroNR = "Hero1"

    Mein Problem ist nun also, wie ich den Wert der Stringvariable in einem allgemeinen Aufrufpfad zum Objekt nutzen kann. Im Sinne von:

    Lbl1.Text = ValueOf(HeroNR).HP

    Den Befehl ValueOf habe ich zur Veranschaulichung erfunden, ich wäre froh wenn man mir hierbei helfen könnte einen variablen Objektaufruf zu programmieren. Denn auch nach stundenlanger Suche im Web und in Literatur bin ich auf keine passende Lösung gestossen.

    Vielen Dank schon Im Vorraus :)

    Freitag, 12. September 2014 13:43

Antworten

  • Hallo,

    Du schreibst von "Objekten" und Du solltest Dich Dich in die objektorientierte Programmierung einarbeiten... (im Web gibt es noch hunderte weitere Beiträge dazu)

    Eine Aufgabe wäre alle Informationen in der Klasse selbst zu speichern. Eine (frei erfundene) Möglichkeit für oben:

        Public Class Hero
            Public Property Nr As Integer
            Public Property HP As Integer
    
            Public ReadOnly Property HeroName As String
                Get
                    Return "Hero " & Nr.ToString()
                End Get
            End Property
    
            Public Overrides Function ToString() As String
                Return String.Format("Hero {0}, Health: {1}", Nr, HP)
            End Function
        End Class
    
        ' Verwendungsbeispiel:
            Dim hero1 As New Hero() With {.Nr = 1, .HP = 250}
            Dim Name As String = hero1.HeroName
            Console.WriteLine(hero1)    ' Verwendet ToString()
    

    Wenn Du nun eine "Heldenarmee" aufstellen willst, so kannst Du eine Auflistung wie eine List(Of Hero) verwenden. Darauf könnte man zum Beispiel LINQ anwenden oder auch eingebaute Methoden, wie Find:

            Dim helden As New List(Of Hero) From
                {
                    New Hero() With {.Nr = 1, .HP = 150},
                    New Hero() With {.Nr = 2, .HP = 350},
                    New Hero() With {.Nr = 3, .HP = 250},
                    New Hero() With {.Nr = 4, .HP = 350}
                }
    
            Dim Held1 = helden.Find(Function(held) held.Nr = 1)
            Console.WriteLine(Held1)
    
            ' Die "stärksten" Helden
            Dim HeldenMitDenMeistenHP =
                From held In helden
                Let MaxHP = helden.Max(Function(heldhp) heldhp.HP)
                Where held.HP = MaxHP
            For Each held In HeldenMitDenMeistenHP
                Console.WriteLine("Starker Held: {0}", held)
            Next
    

    und es gibt unzählige andere Möglichkeiten...

    Gruß Elmar

    • Als Antwort markiert Haldirxx Dienstag, 16. September 2014 08:26
    Freitag, 12. September 2014 14:41
    Beantworter
  • Hi,

    schau dir zusätzlich zu Elmars Angaben vielleicht noch mal das Strategy Pattern an.

    MFG

    Björn

    • Als Antwort markiert Haldirxx Dienstag, 16. September 2014 08:26
    Samstag, 13. September 2014 11:36

Alle Antworten

  • Hallo,

    Du schreibst von "Objekten" und Du solltest Dich Dich in die objektorientierte Programmierung einarbeiten... (im Web gibt es noch hunderte weitere Beiträge dazu)

    Eine Aufgabe wäre alle Informationen in der Klasse selbst zu speichern. Eine (frei erfundene) Möglichkeit für oben:

        Public Class Hero
            Public Property Nr As Integer
            Public Property HP As Integer
    
            Public ReadOnly Property HeroName As String
                Get
                    Return "Hero " & Nr.ToString()
                End Get
            End Property
    
            Public Overrides Function ToString() As String
                Return String.Format("Hero {0}, Health: {1}", Nr, HP)
            End Function
        End Class
    
        ' Verwendungsbeispiel:
            Dim hero1 As New Hero() With {.Nr = 1, .HP = 250}
            Dim Name As String = hero1.HeroName
            Console.WriteLine(hero1)    ' Verwendet ToString()
    

    Wenn Du nun eine "Heldenarmee" aufstellen willst, so kannst Du eine Auflistung wie eine List(Of Hero) verwenden. Darauf könnte man zum Beispiel LINQ anwenden oder auch eingebaute Methoden, wie Find:

            Dim helden As New List(Of Hero) From
                {
                    New Hero() With {.Nr = 1, .HP = 150},
                    New Hero() With {.Nr = 2, .HP = 350},
                    New Hero() With {.Nr = 3, .HP = 250},
                    New Hero() With {.Nr = 4, .HP = 350}
                }
    
            Dim Held1 = helden.Find(Function(held) held.Nr = 1)
            Console.WriteLine(Held1)
    
            ' Die "stärksten" Helden
            Dim HeldenMitDenMeistenHP =
                From held In helden
                Let MaxHP = helden.Max(Function(heldhp) heldhp.HP)
                Where held.HP = MaxHP
            For Each held In HeldenMitDenMeistenHP
                Console.WriteLine("Starker Held: {0}", held)
            Next
    

    und es gibt unzählige andere Möglichkeiten...

    Gruß Elmar

    • Als Antwort markiert Haldirxx Dienstag, 16. September 2014 08:26
    Freitag, 12. September 2014 14:41
    Beantworter
  • Hi,

    schau dir zusätzlich zu Elmars Angaben vielleicht noch mal das Strategy Pattern an.

    MFG

    Björn

    • Als Antwort markiert Haldirxx Dienstag, 16. September 2014 08:26
    Samstag, 13. September 2014 11:36
  • Vielen Dank für die  hilfreichen Antworten :)
    Dienstag, 16. September 2014 08:26