Dynamische Klassen erzeugen

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von mrMo.

    Dynamische Klassen erzeugen

    Hallo zusammen,

    wie schon bei älteren Beiträgen erwähnt bin ich in VB Anfänger.
    Mein neues Problem:
    Ich habe eine Klasse Main, eine Klasse Alfa, eine Klasse Bravo und eine Klasse Charlie. Alfa, Bravo und Charlie stehen in einer Textdatei (als Strings).
    Nun will ich diese Textdatei auslesen und die Klassen in einer Schleife dynamisch erstellen. In etwa so:

    VB.NET-Quellcode

    1. ...
    2. Public Class Main
    3. ...
    4. For Each Kapitelname As String In System.IO.File.ReadAllLines(DateiPfad)
    5. Dim Kapitelname As Object = New Kapitelname ()
    6. Kapitelname.KapitelnameX(...)
    7. Next
    8. ...
    9. End Class


    Finde leider nichts im Netz was mir weiterhilft. Hat mir jemand einen Tipp oder ist das überhaupt möglich?

    Danke im voraus, LG newVBuser
    @newVBuser Jou, das geht. Allerdings solltest Du dazu das Stadium VB Anfänger überwunden haben.
    Gugst Du CodeDom: z.B. hier.
    Und:
    Benenne die Klasse Main um, dieser Name ist anderweitig vergeben.
    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!
    @petaod Jou.
    Serialisierung sollte da reichen. :thumbsup:
    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!
    Sorry für die späte Antwort.
    Textdatei sind dann nur Strings zeilenweise, wie:
    MeinAuto
    MeinHaus
    MeinHund
    ...

    für Serialisierung ist XML dann eher wie:

    XML-Quellcode

    1. <xmldat>
    2. <Auto>
    3. <Marke>BMW</Marke>
    4. <Modell>5er</Modell>
    5. </Auto>
    6. </xmldat>


    und vb dann etwa so möglich:

    VB.NET-Quellcode

    1. public class Auto
    2. {
    3. Dim Marke As New Marke
    4. Marke(Modell)
    5. }


    Das mit Codedom sieht nach Aufwand auf. Main ruft da ja Command auf mit zwei Parametern, was ich dann anpassen müsste, da ich vier habe.
    Wozu dient da Codedom? Wird doch nicht aufgerufen oder ist die Klasse nur für den Compiler relevant?

    lg

    newVBuser schrieb:

    Wozu dient da Codedom?
    Der Designer im Studio funktioniert z.B. mit CodeDom.
    Man kann damit ganz nette dynamische Extensionen machen, aber das ist eher hohe Schule.
    Vielleicht beschreibst Du zunächst Dein grundsätzliches Problem.
    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!
    Naja, ich rufe in Main viele verschiedene Klassen auf, ca 15 Stück. Das sieht nur unübersichtlich aus.

    VB.NET-Quellcode

    1. ...
    2. Sub Main()
    3. Dim Klasse01 As New Klasse01
    4. Klasse01.xyz()
    5. Dim Klasse02 As New Klasse02
    6. Klasse02.xyz()
    7. Dim Klasse03 As New Klasse03
    8. Klasse03.xyz()
    9. ...
    10. End Sub


    Deshalb wollte ich wie Anfangs beschrieben dies in einer For Each Schleife erledigen und eine Datei auslesen um den Code in Main zu reduzieren. Text oder XML egal.
    CodeDom scheint recht schwer zu sein. Dachte dies könnte man auch leichter lösen. Scheint ich muss mich da tief einlesen in die von euch vorgeschlagenen Themen.

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

    @newVBuser Die Herangehensweise in Deinem Snippet ist völlig normal und üblich, da hast Du keinen Handlungsbedarf.
    Wenn Du die Klassen von einer gemeinsamen Basisklasse ableitest, kannst Du eine Liste dieser Instanzen erstellen und dann per For Each die Prozedur .xyz() aufrufen:

    VB.NET-Quellcode

    1. Dim ll = New List(Of BaseClass0)
    2. ll.Add(New Klasse01)
    3. ll.Add(New Klasse02)
    4. ll.Add(New Klasse03)
    5. For Each entry In ll
    6. entry.xyz()
    7. Next
    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!
    Falls dir das zu unübersichtlich wird, pack das alles in eine #Region und klapp diese dann ein.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Hallo zusammen, nachdem ich mal mit codedom beschäftigt habe, glaub ich zu erahnen wozu es gut ist.

    Mit Codedom kann man sich Namespaces definieren:
    CodeNamespace customEntityRoot = new CodeNamespace("Root")
    ...
    Klassen:
    CodeTypeDeclaration derived = new CodeTypeDeclaration("Kapitel")
    ...
    Methode:
    CodeMemberMethod derivedMethod = new CodeMemberMethod()
    derivedMethod.Name = "MethodenName"
    ...

    Das ganze erzeugt eine komplett neue Klasse. Nur habe ich die Klassen bereits und wollte diese nur erzeugen und aufrufen.

    Eine der vorhandenen Klassen (Beispiel)

    VB.NET-Quellcode

    1. Public Class Auto()
    2. Sub fahren(Geschwindigkeit)
    3. ...
    4. End Sub
    5. End Class


    Modul Main (Beispiel)

    VB.NET-Quellcode

    1. Public Module Kfz
    2. Sub Main()
    3. For Each Kapitel As String In System.IO.File.ReadAllLines(ausTEXTDATEI)
    4. Dim Kapitel As Object = New Kapitel()
    5. Kapitel.fahren(Geschwindigkeit)
    6. Next
    7. End Sub
    8. End Module


    Der Name des Kapitel soll aus aus der Textdatei kommen(Beispiel)
    Auto
    Lkw
    Bus
    Zug
    ...

    Also nur Objekt erzeugen durch die Schleife. Als erstes Klasse Auto erzeugen, danach Klasse Lkw ...
    Sowas fand ich, während dem ich mich mit Codedom beschäftigte, nicht heraus.

    LG
    @newVBuser CodeDom erzeugt Instanzen von Klassen, die als compilierbarer Quelltext vorliegen.
    Kannst Du bitte mal erläutern, was Du eigentlich vor 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!
    Mir scheint, du bringst allerlei durcheinander.
    Per Code kann man keine Klassen erzeugen, denn Klassen sind Code.
    Per Code kannst du Objekte erzeugen, nämlich Instanzen einer Klasse.
    Eine Klasse ist der Bauplan für Objekte, und programmieren heisst, Baupläne entwerfen.
    Zur Laufzeit können dann daraus Objekte gebaut werden.

    Derlei Begriffe muss man unbedingt auseinanderhalten, beim proggen.
    Gugge auch: Grundlagen: Fachbegriffe
    Aha, du möchtest zu Laufzeit mehrere Instanzen einer Klasse erstellen. Dies geht mit dem Magischen Zauberwort "New".

    so nicht:
    Dim Kapitel As Object = New Kapitel()
    Kapitel.fahren(Geschwindigkeit)

    So besser:
    Dim Fahrzeug As New Kapitel()
    Fahrzeug.fahren(Geschwindigkeit)

    Fahrzeug ist hier die Instanz von Kapitel. Wie diese heißt ist an sich Wurst wenn die Instanz zur Laufzeit erstellt wird. Wenn diese einen Namen benötigt gib z.B. deinem Kapitel eine Property "Name" welcher du dann mit Fahrzeug.Name = "LKW" zuweisen kannst.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Durcheinander birngen nicht, eher unverständlich rüber gebracht was ich will. Schon klar, das Klassen der Bauplan sind und diese Objekte erzeugt werden sollen.

    Mir geht es nur darum, ob es möglich ist Objekte in einer foreach Schleife zu erzeugen, deren Klassenname als String in einer Textdatei liegen anstatt jedes einzeln zu erzeugen. Denn, es waren mal rund 15 Objekt erzeugungen, jetzt mehr. Dies sollte nur den Code reduzieren, woran ich immer noch interessiert bin dies irgendwie zu schaffen.

    Name Kapitel war vielleicht eine irreführende Wahl. Vielleicht wäre dort "i" oder "x" besser als Beispiel. Dies soll nur ein Platzhalter sein. Der Name des zu erzeugenden Objektes sollte aus der Textdatei kommen und letztenendes ähnlich wie "mrMo" schrieb den Platzhalter ersetzen:

    Dim Auto As New Kapitel()
    Auto.fahren(Geschwindigkeit)

    das Objekt Auto erzeugen und eine Methode davon aufrufen soll.

    Vielen Dank das ihr so fleißig versucht mir zu helfen, hoffe ich bringe euch mit meinen Wirren Gedanken nicht auf die Palme.
    Lg
    Ok, scheinbar ist der Koten noch nicht ganz geplatzt ;)

    ​Wozu müssen in deinem Code die Instanzen von "Kapitel" einen bestimmten zur Laufzeit generierten Namen/Bezeichnung haben? Das ist dem User doch völlig egal wie die heißen.

    Wenn dir die Schreibarbeit zu viel ist, programmier dir nen CodeGenerator (Separates Programm) von dem du per Copy&Paste fertigen Code in dein Projekt kopieren kannst.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    ob es möglich ist Objekte in einer foreach Schleife zu erzeugen, deren Klassenname als String in einer Textdatei liegen anstatt jedes einzeln zu erzeugen

    Ja, das geht. Wenn auch nicht ganz einfach. Es gibt da mehrere Möglichkeiten:
    Statische Funktionen abgeleiteter Klassen aufrufen
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Na, ich glaub, da geht nachwievor was durcheinander.
    Klassennamen kann man nämlich nicht aus Textdateien einlesen, oder nur mit äusserster Gewalt (CodeDom). Und unter Umgehung ungefähr aller objektorientierter Prinzipien.

    Liefe auf ein Plugin-System hinaus, aber ich bezweifel ganz stark, dass du so etwas wirklich brauchst.
    In 95% aller Fälle lassen Probleme sich lösen, indem man für den Anwendungszweck wirklich geeignete Klassen codet.
    Aber was bei dir der wirkliche Anwendungszweck ist, darüber lässt du uns ja im Dunkeln.
    Ich glaub jdfs. nicht, dass du - wie dein Snippet suggeriert - Kapitel haben möchtest, die mit irgendwelchen Geschwindigkeiten fahren.

    Auch Autos fahren zu lassen erfordert kein PlugIn-System, auch bei unterschiedlichen Auto-Typen nicht.
    Man gebe der Auto-Klasse einfach eine Property Type, und schon unterstützt das Klassendesign auch mehrere AutoTypen, und zwar mit nur einer Klasse, OOP, ohne CodeDom und whatever.

    ErfinderDesRades schrieb:

    Aber was bei dir der wirkliche Anwendungszweck ist, darüber lässt du uns ja im Dunkeln.

    1. Sehe ich auch so
    2. Klassennamen <> Instanz Name/Bezeichnung
    2. Thema Klassen nicht verstanden, würde ich Tippen

    @newVBuser
    Schau dir das Thema mit den Klassen nochmal ausführlich an. Das man teils viele verschiedene Klassen deklarieren/instanziieren muss ist nicht unüblich.

    Braucht man mehrere Instanzen der selben Klasse und diese sollen zur Laufzeit erstellt werden, ist der Name Wurscht. Eher würde man eine Instanz "Fahrzeug" nennen als Auto, LKW oder ähnliches. Daher hat der @ErfinderDesRades dir den Tipp mit der Property "Type" gegeben und ich dir mit "Name" etwas ähnliches empfohlen. Diese kannst du dann auf Auto, LKW etc. setzen.

    Und was mich immer noch interessiert, du aber leider nicht darauf eingehst: Was machst du mit den ganzen Instanzen der selben Klasse? :)

    Grüße und einen schönen Abend
    mrMo
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen