Frage zur Handhabung von Klassen (Beispiel Auto) und immer wieder zugreifen auf den BMW, Mercedes, Telsa etc.

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Dksksm.

    Frage zur Handhabung von Klassen (Beispiel Auto) und immer wieder zugreifen auf den BMW, Mercedes, Telsa etc.

    Moin!

    ich muss mir Funktionen für eine Ebenensteuerung erstellen und neben den Parametern soll das Schalten On/Off dort hinterlegt werden.

    Das müsste ja im Grunde genommen wie bei dem allgemeinen Beispiel der Klassen-Entwicklung mit dem Auto (z.b. hier: blog.bigbasti.com/vb-net-saube…-erstellen-mit-propertys/) funktionieren.

    Um die Fahrzeuge später in der gesamten Funktion verwenden zu können würde man dann an einer Stelle alle AutoTypen (Ebenen) in der Form

    VB.NET-Quellcode

    1. Dim Tesla as new Auto With {.marke = "Tesla", .motor = "Elektro", .geschw = 0})
    2. Dim Golf as new Auto With {.marke = "VW", .motor = "Diesel", .geschw = 0})
    3. Dim 3er as new Auto With {.marke = "BMW", .motor = "Benzin", .geschw = 0})
    4. Dim Sklasse as new Auto With {.marke = "Mercedes", .motor = "Super", .geschw = 0})


    definieren.

    Ist das richtig?

    Die Eigenschaft motor könnte ich dann auch als ENUM mit den verschiedenen Antriebsmitteln erstellen - was eingabesicherer wäre?

    Gruß Jan

    Nachtrag: kann ich ein solches Fahrzeug als Konstante über das gesamte Projekt zur Verfügung stellen oder wie würdet Ihr darauf zugreifen?

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

    jan99 schrieb:

    Um die Fahrzeuge später in der gesamten Funktion verwenden zu können würde man dann an einer Stelle alle AutoTypen (Ebenen) in der Form

    VB.NET-Quellcode[...]

    Ist das richtig?
    Nein - schon weil das kein ganzer Satz ist.
    Auch zeigt der Code keine "AutoTypen (Ebenen)" (was immer das sein mag), sondern er zeigt, wie 4 verschiedene Auto-Objekte instanziert werden.

    jan99 schrieb:

    Die Eigenschaft motor könnte ich dann auch als ENUM mit den verschiedenen Antriebsmitteln erstellen - was eingabesicherer wäre?
    Ja

    jan99 schrieb:

    Nachtrag: kann ich ein solches Fahrzeug als Konstante über das gesamte Projekt zur Verfügung stellen oder wie würdet Ihr darauf zugreifen?
    Du kannst ein solches Fahrzeug über das gesamte Projekt zur Verfügung stellen - allerdings nicht als "Konstante".
    Es sei denn, du verstehst unter "Konstante" was anderes, als was mit dem vb-Schlüsselwort const gemeint ist.
    Du kannst auch Schreib-Zugriffe auf ein solch verfügbar gemachtes Fahrzeug unterbinden - das nennt man aber ReadOnly (auch ein vb-Schlüsselwort).
    @jan99 Wenn Du Deine Typen, den Motor und ggf. weitere enumerierst, kannst Du in der GUI dafür eine ComboBox verwenden und der alle Enum-Items als DataSource verwenden:

    VB.NET-Quellcode

    1. ComboBox1.DataSource = System.Enum.GetValues(GetType(enumAutoMarke))
    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!

    ErfinderDesRades schrieb:

    jan99 schrieb:

    Um die Fahrzeuge später in der gesamten Funktion verwenden zu können würde man dann an einer Stelle alle AutoTypen (Ebenen) in der Form

    VB.NET-Quellcode[...]

    Ist das richtig?
    Nein - schon weil das kein ganzer Satz ist.


    hier habe ich das "defininieren" ergänzt.

    War wohl noch etwas früh.

    ErfinderDesRades schrieb:


    Auch zeigt der Code keine "AutoTypen (Ebenen)" (was immer das sein mag), sondern er zeigt, wie 4 verschiedene Auto-Objekte instanziert werden.


    In den ()-Klammern habe ich die Bezeichnung aus meiner Anwendung geschrieben. Das Auto ist das Beispiel.

    Jan


    @jan99 Du kannst doch mit AutoKlasse.Create(EnMarke.Opel) eine Default-Instanz für jeden Typ bereitstellen.
    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!
    Moin!

    ich bin jetzt einmal wieder auf der Baustelle.

    Als Klasse habe ich erst einma folgendes definiert:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class LayerDefinitionen
    2. Private _MinZoom As Integer = -1
    3. Private _MaxZoom As Integer = -1
    4. Private _Definition As String = ""
    5. Public Sub New()
    6. End Sub
    7. ''' <summary>
    8. ''' ab dieser Zoomstufe wird angezeigt
    9. ''' </summary>
    10. ''' <returns>ab welcher Zooomstufe wird mehr angezeigt</returns>
    11. Public Property MinZoom() As Integer
    12. Get
    13. Return _MinZoom
    14. End Get
    15. Set(ByVal value As Integer)
    16. _MinZoom = value
    17. End Set
    18. End Property
    19. ''' <summary>
    20. ''' ab dieser Zoomstufe wird NICHT
    21. ''' </summary>
    22. ''' <returns>ab welcher Zooomstufe wird NICHT mehr angezeigt</returns>
    23. Public Property MaxZoom() As Integer
    24. Get
    25. Return _MaxZoom
    26. End Get
    27. Set(ByVal value As Integer)
    28. _MaxZoom = value
    29. End Set
    30. End Property
    31. ''' <summary>
    32. ''' Bezeichnung in der Ebenen-Palette
    33. ''' </summary>
    34. ''' <returns>Bezeichnung in der Ebenen Palette</returns>
    35. Public Property Definition() As String
    36. Get
    37. Return _Definition
    38. End Get
    39. Set(ByVal value As String)
    40. _Definition = value
    41. End Set
    42. End Property
    43. End Class



    Nun wollte ich in dem Modul mit den globalen Parametern meine Layer definieren.

    VB.NET-Quellcode

    1. Public fLayer As New LayerDefinitionen
    2. Public LayerDefinitions As New List(Of LayerDefinitionen)


    Wenn ich aber jetzt der List of LayerDefinitionen etwas hinzufügen will

    VB.NET-Quellcode

    1. LayerDefinitions.add


    dann wird mir schon das ADD nicht angeboten.

    Habe ich einen Gedankenfehler?

    Gruß Jan
    @jan99 Kann es sein, dass Du die .Add-Zeile nicht in einer Prozedur untergebracht hast?
    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!
    btw: Sollte bei den Property-Gettern und -Settern nix dazu kommen, reicht auch:

    VB.NET-Quellcode

    1. Public Class LayerDefinitionen
    2. ''' <summary>ab dieser Zoomstufe wird angezeigt</summary>
    3. ''' <returns>ab welcher Zooomstufe wird mehr angezeigt</returns>
    4. Public Property MinZoom As Integer = -1
    5. ''' <summary>ab dieser Zoomstufe wird NICHT</summary>
    6. ''' <returns>ab welcher Zooomstufe wird NICHT mehr angezeigt</returns>
    7. Public Property MaxZoom As Integer = -1
    8. ''' <summary>Bezeichnung in der Ebenen-Palette</summary>
    9. ''' <returns>Bezeichnung in der Ebenen Palette</returns>
    10. Public Property Definition As String = ""
    11. End Class
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    RodFromGermany schrieb:

    @jan99 Kann es sein, dass Du die .Add-Zeile nicht in einer Prozedur untergebracht hast?
    vb-paradise.de/index.php/Attac…b4e022e0a87fd333e1e654c5e


    Aber ist erweitere doch eine List (of...) und da ist doch das ADD enthalten.

    Deshalb verstehe ich das nicht ...?

    gruß Jan
    Aber das funktioniert nur innerhalb einer Methode (Sub/Function), nicht außerhalb.
    Das geht:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public LayerDefinitions As New List(Of LayerDefinitionen)
    3. Private Sub MachWas()
    4. LayerDefinitions.Add(New LayerDefinitionen)
    5. End Sub

    Das nicht:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public LayerDefinitions As New List(Of LayerDefinitionen)
    3. LayerDefinitions.Add(New LayerDefinitionen)

    Weil dann nicht klar ist, wann da was hinzugefügt werden soll. Falls Du zum Programmstart was hinzufügen willst, kannst Du 2 Sachen machen. In der Deklaration

    VB.NET-Quellcode

    1. Public LayerDefinitions As New List(Of LayerDefinitionen) From {New LayerDefinitionen}

    oder Add in einer Sub ausführen, z.B. im Form1_Load-EventHandler
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Hatten wir bereits.
    @jan99 Poste die komplette Klasse und markiere die Zeile, in der kein .Add() kommt.
    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!
    Moin!

    VaporiZed schrieb:

    btw: Sollte bei den Property-Gettern und -Settern nix dazu kommen, reicht auch:

    VB.NET-Quellcode

    1. Public Class LayerDefinitionen
    2. ''' <summary>ab dieser Zoomstufe wird angezeigt</summary>
    3. ''' <returns>ab welcher Zooomstufe wird mehr angezeigt</returns>
    4. Public Property MinZoom As Integer = -1
    5. ''' <summary>ab dieser Zoomstufe wird NICHT</summary>
    6. ''' <returns>ab welcher Zooomstufe wird NICHT mehr angezeigt</returns>
    7. Public Property MaxZoom As Integer = -1
    8. ''' <summary>Bezeichnung in der Ebenen-Palette</summary>
    9. ''' <returns>Bezeichnung in der Ebenen Palette</returns>
    10. Public Property Definition As String = ""
    11. End Class


    ich bin einmal wieder auf der Baustelle und habe folgendes Gerüst. Aber irgendwo ist da noch ein Gedankenfehler bei der "Befüllung" von _LayerDefintions. Habe den o.g. Teil übernommen.

    Aber mich wundert, dass ich unterhalb der Classendefinition von LayerDefinitionen die Variablen als Public definieren muss. Ich dachte der Zugriff erfolgt über die Eigenschaften mit gleichem Namen.

    ????

    Gruß Jan

    jan99 schrieb:

    Ich dachte der Zugriff erfolgt über die Eigenschaften mit gleichem Namen.
    Daas sind genau diese Eigenschaften.
    In früheren .NET-Versionen waren die Hilfsvariablen zwingend erforderlich, heute werden die vom Compiler generiert.
    Wenn Du außer der Hin- und Her-Zuweisung noch was anderes im Setter tun musst, brauchst Du natürlich wieder diese Hilfsvariablen.
    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!
    docs.microsoft.com/de-de/dotne…ed-elements/access-levels

    Es sind keine Variablen sondern Properties. Public ist vielleicht nicht immer nötig aber da fehlt mir die Erfahrung da ich meine Klassen tatsächlich in eigene Projekte ausgelagert habe und somit müssen die Klassen bei mir Public sein. In C# benutze ich manchmal auch kleine Klassen deren Aufgabe Informationstransport ist. Wobei das nicht ganz stimmt, denn natürlich macht so ein Gerüst (Klasse) selbst ja nichts ausser die Struktur bereit zu stellen.
    Du verwendest in deinem Code ja auch eine List Of Class, die Liste beinhaltet die Objekte, nicht die Klasse an sich. Deine Liste kann ja Private sein, je nachdem wo du sie benötigst.

    Nachtrag: Property = Eigenschaft