Auf Klasse zugreifen

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Auf Klasse zugreifen

    Hallo,
    ich steh grad irgendwie voll auf dem Schlauch, wieso kann ich nicht auf die Elemente "Holz", "Lehm" und "Eisen" in dieser Klasse zugreifen?

    Public Class Gebäude
    Public Class Hauptgebäude
    Public Holz() As Integer = {1, 2, 3, 4}
    Public Lehm(29) As Integer
    Public Eisten(29) As Integer
    End Class
    End Class
    Du brauchst in Gebäude eine Instanz von deinem Hauptgebäude. (Natürlich auch eine Instanz von Gebäude).
    Du solltest die lieber nochmal eine paar Dinge zu OOP angucken, denn man würde sowas was du anscheinend versuchst über veerbung lösen.
    Danke, mit

    Quellcode

    1. Public Shared Lehm(29) As Integer
    geht es.
    Ich möchte ja eigentlich nur den Einzelnen Gebäuden feste Werte für ihre Stufe zuweisen, also die Werte müssen während der Laufzeit nicht mehr geändert werden. Wenn jemand eine bessere Lösung weiß bin ich natürlich offen für Vorschläge ;)
    Und schachtel nicht 2 Klassen ineinander, das verstehst Du noch nicht.
    Nimm nicht Shared Element, sondern leg Instanzen Deiner Klassen mit New an und greif dann auf die elemente zu.
    Wenn Du 2 Instanzen hast und ein Shared Element, gibt es dieses nur 1x im Speicher.

    VB.NET-Quellcode

    1. Dim d1 As New MyClass
    2. Dim d2 As New MyClass
    3. d1.Holz = 5
    4. d2.Holz = 7
    d1.Element geht nicht, Du müsstest dann über MyClass.Element drauf zugreifen.
    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!

    Eisvogel schrieb:

    Ich möchte ja eigentlich nur den Einzelnen Gebäuden feste Werte für ihre Stufe zuweisen, also die Werte müssen während der Laufzeit nicht mehr geändert werden. Wenn jemand eine bessere Lösung weiß bin ich natürlich offen für Vorschläge ;)

    Also mit Shared bekommt jedes Gebäude exakt diesen Wert - deswegen heißen solche Properties auch Shared - alle Gebäude teilen sich den Lehm.

    Wenn verschiedene Gebäude verschiedenen Lehm haben sollen, geht das nicht mit Shared.

    Ich empfehle, diese wichtige Thematik richtig zu lernen, nicht aus ForenPosts zusammengereimt: dieses Buch Lesen
    Ich weiß ja nicht was ihr hab mit "das verstehst du noch nicht" und Klassen ineinander verschachteln und ... Naja so wie ich es bisher habe funktioniert es ja ganz gut, falls ihr Verbesserungvorschläge habt könnt ihr es mir ja sagen, aber solche Kommentare wie oben genannt helfen mir leider nicht wirklich weiter.

    Quellcode

    1. Public Class Gebäude
    2. Public Class Hauptgebäude
    3. Public Shared Holz() As Integer = {90, 113, 143, 180, 227, 286, 360, 454, 572, 720, 908, 1144, 1441, 1816, 2288, 2883, 3632, 4577, 5767, 7266, 9155, 11535, 14534, 18313, 23075, 29074, 36633, 46158, 58159, 73280}
    4. Public Shared Lehm() As Integer = {80, 102, 130, 166, 211, 270, 344, 438, 559, 712, 908, 1158, 1476, 1882, 2400, 3060, 3902, 4975, 6343, 8087, 10311, 13146, 16762, 21371, 27248, 34741, 44295, 56476, 72007, 91809}
    5. Public Shared Eisen() As Integer = {70, 88, 111, 140, 176, 222, 280, 353, 445, 560, 706, 890, 1121, 1412, 1779, 2242, 2825, 3560, 4485, 5651, 7120, 8972, 11304, 14244, 17947, 22613, 28493, 35901, 45235, 56996}
    6. Public Shared Zeit() As Double = {1.03, 1.05, 1.08, 1.1, 1.16, 1.19, 1.22, 1.25, 1.28, 1.31, 1.34, 1.38, 1.41, 1.45, 1.48, 1.52, 1.56, 1.6, 1.64, 1.68, 1.72, 1.76, 1.81, 1.85, 1.9, 1.95, 2, 2.05, 2.1}
    7. End Class
    8. Public Class Kaserne
    9. Public Shared Holz() As Integer = {200, 252, 318, 400, 504, 635, 800, 1008, 1271, 1601, 2017, 2542, 3202, 4035, 5084, 6406, 8072, 10170, 12814, 16146, 20344, 25634, 32298, 40696, 51277}
    10. Public Shared Lehm() As Integer = {170, 218, 279, 357, 456, 584, 748, 957, 1225, 1568, 2007, 2569, 3288, 4209, 5388, 6896, 8827, 11298, 14462, 18511, 23695, 30329, 38821, 49691, 63605}
    11. Public Shared Eisen() As Integer = {90, 113, 143, 180, 227, 286, 360, 454, 572, 720, 908, 1144, 1441, 1816, 2288, 2883, 3632, 4577, 5767, 7266, 9155, 11535, 14534, 18313, 23075}
    12. Public Shared Zeit() As Double = {}
    13. End Class
    14. End Class

    Eisvogel schrieb:

    Klassen ineinander verschachteln

    VB.NET-Quellcode

    1. Class a
    2. Class b
    3. End Class
    4. End Class
    Wenn ich Deinen Code sehe, weiß ich, dass dies für Dich noch ein wenig zu hoch ist.
    Meinst Du etwa dies hier:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Class Gebäude
    2. Public Holz() As Integer
    3. Public Lehm() As Integer
    4. Public Eisen() As Integer
    5. Public Zeit() As Double
    6. End Class
    7. Class Hauptgebäude
    8. Inherits Gebäude
    9. Sub Hauptgebäude()
    10. Holz = New Integer() {90, 113, 143, 180, 227, 286, 360, 454, 572, 720, 908, 1144, 1441, 1816, 2288, 2883, 3632, 4577, 5767, 7266, 9155, 11535, 14534, 18313, 23075, 29074, 36633, 46158, 58159, 73280}
    11. Lehm = New Integer() {80, 102, 130, 166, 211, 270, 344, 438, 559, 712, 908, 1158, 1476, 1882, 2400, 3060, 3902, 4975, 6343, 8087, 10311, 13146, 16762, 21371, 27248, 34741, 44295, 56476, 72007, 91809}
    12. Eisen = New Integer() {70, 88, 111, 140, 176, 222, 280, 353, 445, 560, 706, 890, 1121, 1412, 1779, 2242, 2825, 3560, 4485, 5651, 7120, 8972, 11304, 14244, 17947, 22613, 28493, 35901, 45235, 56996}
    13. Zeit = New Double() {1.03, 1.05, 1.0800000000000001, 1.1000000000000001, 1.1599999999999999, 1.1899999999999999, 1.22, 1.25, 1.28, 1.3100000000000001, 1.3400000000000001, 1.3799999999999999, 1.4099999999999999, 1.45, 1.48, 1.52, 1.5600000000000001, 1.6000000000000001, 1.6399999999999999, 1.6799999999999999, 1.72, 1.76, 1.8100000000000001, 1.8500000000000001, 1.8999999999999999, 1.95, 2, 2.0499999999999998, 2.1000000000000001}
    14. End Sub
    15. End Class
    16. Class Kaserne
    17. Inherits Gebäude
    18. Sub Kaserne()
    19. Holz = New Integer() {200, 252, 318, 400, 504, 635, 800, 1008, 1271, 1601, 2017, 2542, 3202, 4035, 5084, 6406, 8072, 10170, 12814, 16146, 20344, 25634, 32298, 40696, 51277}
    20. Lehm = New Integer() {170, 218, 279, 357, 456, 584, 748, 957, 1225, 1568, 2007, 2569, 3288, 4209, 5388, 6896, 8827, 11298, 14462, 18511, 23695, 30329, 38821, 49691, 63605}
    21. Eisen = New Integer() {90, 113, 143, 180, 227, 286, 360, 454, 572, 720, 908, 1144, 1441, 1816, 2288, 2883, 3632, 4577, 5767, 7266, 9155, 11535, 14534, 18313, 23075}
    22. End Sub
    23. End Class
    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!
    @Rod: mir scheint, du bringst VB-Syntax mit c#-Syntax durcheinander.
    @TE: VerbesserungsVorschläge sind schwierig - ich weiß ja nicht, wasses werden soll. Jedenfalls, wenn du vorhast, Hauptgebäude-Objekte und Kaserne-Objekte gelegentlich gemeinsam als "Gebäude" zu verarbeiten, bringt der Ansatz mit verschachtelten Klassen nix, sondern da brauchst du eher so ein Design wie von Rod vorgeschlagen, wo Hauptgebäude und Kaserne eine gemeinsame Basisklasse haben.
    Dazu ist aber ein Verständnis der Vererbungslehre notwendig, und dazu, wie gesagt: dieses Buch Lesen
    Du kannst natürlich auch ein schlechteres Buch lesen, vlt. grade weil ich dir das beste mir bekannte vorgeschlagen habe, aber ohne eine fundierte Einführung, wie Vererbung in VB funzt, gehts einfach nicht.

    Anerkennen tu ich allerdings, dass deine Vorstellungen sich von selbst in diese Richtung bewegen, also mir scheints, dass du von selbst auf die Notwendigkeit gekommen bist, Vererbung verfügbar zu haben, sogar ohne, dasses dir vorgekaut wurde :thumbup: