steinadler Geschrieben 4. Dezember 2006 Geschrieben 4. Dezember 2006 Hallo, gibt es (auĂer if-then) eine Möglichkeit per switch-case Objekte abzufragen, also zum Beispiel so. CMyClass mc0 = new CMyClass(); CMyClass mc1 = new CMyClass(); CMyClass mc2 = new CMyClass(); CMyClass mc3 = new CMyClass(); CMyClass actual; void run() { actual = mc0; switch(actual) { case mc0: ... usw. }
Mister A Geschrieben 4. Dezember 2006 Geschrieben 4. Dezember 2006 hmm.. meines wissens nicht, denn case verlangt einen Ausdruck wie z.B. einen string oder einen Wert, und lĂ€sst kein objekt zu. du könntest aber ĂŒber den objektnamen gehen, der dir dann "mc[n]" zurĂŒckgibt und somit lieĂe sich das in eine switch case struktur einbauen. Musst nur aufpassen daĂ du nicht den BaseName zum Vergleich heranziehst, denn der wĂ€re immer "CMyClass" in deinem Besispiel.
steinadler Geschrieben 4. Dezember 2006 Autor Geschrieben 4. Dezember 2006 So in der Art hab ichs jetz auch: also die Klasse hat nen Name (string) und danach wird geswitcht. Allerdings ist das sehr störanfÀllig weil man schnell Schreibfehler macht.
TDM Geschrieben 4. Dezember 2006 Geschrieben 4. Dezember 2006 gibt es (auĂer if-then) eine Möglichkeit per switch-case Objekte abzufragen, also zum Beispiel so. Meines Wissens können unter C# keine Objekte fĂŒr das 'Switching' verwendet werden. Du kannst ja eine eindeutige Variable fĂŒr jedes Objekt erzeugen lassen. (Z.B. Hashcode oder eben wie bereits erwĂ€hnt den Namen) und diese dann prĂŒfen. Eine Enumeration wĂŒrde hier glaub ich auch gehen.
steinadler Geschrieben 4. Dezember 2006 Autor Geschrieben 4. Dezember 2006 Die Objekte sollen jeweils noch Parameter- und Wert-Felder haben. Deshalb möchte ich keinen enum nehmen. Gibts denn noch eine bessere Möglichkeit als den Namensstring der Objekte abzufragen? ID möcht ich ungern nehmen, da dies die Leserlichkeit des Codes verschlechtert.
TDM Geschrieben 4. Dezember 2006 Geschrieben 4. Dezember 2006 Die Objekte sollen jeweils noch Parameter- und Wert-Felder haben. Deshalb möchte ich keinen enum nehmen. Gibts denn noch eine bessere Möglichkeit als den Namensstring der Objekte abzufragen? ID möcht ich ungern nehmen, da dies die Leserlichkeit des Codes verschlechtert. Also ich hab nochmal nachgeschaut und Objekte funktionieren wirklich nicht. Switch Statement & Objects - .NET C# The switch statement only supports numbers & strings, it does not support objects. Also entweder du schreibst selber eine Type-Safe-Enumeration, gehst ĂŒber foreach oder machst ein schönes if-else. Was willst du eigentlich prĂŒfen mit dem Switch ?
steinadler Geschrieben 4. Dezember 2006 Autor Geschrieben 4. Dezember 2006 Ich hab ne Klasse, die verschiedene Schritte nacheinander ausfĂŒhrt. Jeder Schritt ist ne eigene Klasse (mit eigenen Parametern). Da die AktivitĂ€ten aller Schritte nicht in einzelnen Funktionen stehen sollen, gibt es eine Funktion in der mit switch-case der aktuelle Schritt geprĂŒft wird und abhĂ€ngig davon dann die gewĂŒnschte AktivitĂ€t ausgefĂŒhrt wird.
TDM Geschrieben 4. Dezember 2006 Geschrieben 4. Dezember 2006 Aus der Kalten wĂŒrde ich sagen, dass du einfach ein Interface benutzt, welches eine Funktion implementiert, die dann jede Klasse besitzt. Diese leitet dann einfach an die entsprechende Funktion weiter oder so. Dann kannst du dir Switching auch sparen. MĂŒsst ich mir aber genauer anschauen.
steinadler Geschrieben 4. Dezember 2006 Autor Geschrieben 4. Dezember 2006 So sollte es sein: Schritt1 = Ausgabe; Parameter = "Geben Sie einen Wert ein"; Schritt2 = Auf Eingabe warten; Parameter = "5 Sekunden"; Schritt3 = Eingabe auswerten in einer Endlosschleife steht dann: { Aktuell = Schritt1; switch(Aktuell) { case Schritt1: Gehe zu Zeile x und Schreibe den Text aus Parameter hin case Schritt2: Warte darauf, bis der Nutzer etwas eingibt u.s.w } }
Klotzkopp Geschrieben 4. Dezember 2006 Geschrieben 4. Dezember 2006 Und was machst du nach dem switch mit Aktuell?
TDM Geschrieben 4. Dezember 2006 Geschrieben 4. Dezember 2006 Schritt2 = Auf Eingabe warten; Parameter = "5 Sekunden"; Ich fĂŒr meinen Teil, wĂŒrde hier lieber Parameter = 5 (Integer) nehmen. Sekunden kannst du dann immer noch dazudichten. Ansonsten stellt sich fĂŒr mich die Frage, warum du die Sachen nicht als Variablen implementierst ? Text ausgaben ect. funktionieren ja auch so. btw: eine Klasse fĂŒr einzelne Schritte halte ich nicht fĂŒr effizient
steinadler Geschrieben 4. Dezember 2006 Autor Geschrieben 4. Dezember 2006 Das war nur der grobe Ablauf, also so wie ich mir das vorstelle. @Klotzkopp: In jedem case wird in Aktuell der nĂ€chste Schritt gesetzt. @TDM: Das mit den Sekunden ist schon klar, das war nur beispielhaft. Momentan besteht ein Parameter aus einem Namen und einem Wert. Meine Aufgabe ist, ne StateMachine zu entwickeln, zu der ich SubStates hinzufĂŒgen kann und jedem State möglichst noch Parameter ĂŒbergeben kann. In einer bestehenden Anwendung war das so gelöst, dass man mit Add(funktion) eine neue Funktion (aus einem Delegaten) anfĂŒgen konnte, welche dann ausgefĂŒhrt wurde. Allerdings hatte das den Nachteil, das man dann mitunter 50 Funktionen hat. Deshalb wollte ich anstreben, die 50 Schritte in eine einzige Funktion zu packen.
TDM Geschrieben 4. Dezember 2006 Geschrieben 4. Dezember 2006 Naja, aber die Schritte bleiben doch gleich oder stellst du dann die neuen Funktionen in der Ausgabe zur VerfĂŒgung ? Es gibt sowas wie Add(funktion) ? Die implementiert eine Funktionkomplet mit Methodenrumpf und so ? :eek Ich glaub ich sollte auch mal C# lernen... Dann brauch ich mich nicht wie bei Java und C++ mit Kompilieren rumschlagen.
steinadler Geschrieben 4. Dezember 2006 Autor Geschrieben 4. Dezember 2006 NatĂŒrlich bleiben die Schritte gleich. Allerdings mĂŒsste noch ein Schritt hinzu, und zwar der "IDLE"-Schritt. Sozusagen das Nichts-Tun. Der wĂŒrde vorm Start des ganzen und nach dem Auswerten der Eingabe laufen. Es gab eine Add(funktion)-Funktion. Dieser wurde als Parameter eine Funktion ĂŒbergeben, in der stand, was bei diesem Schritt zutun ist. Allerdings entstehen durch 30 Adds auch 30 Funktionen... Wieso mit Kompilieren rumschlagen?
TDM Geschrieben 4. Dezember 2006 Geschrieben 4. Dezember 2006 hmm ich dachte der schreibt die Klasse um ich wĂŒrde eher sowas machen wie: getParameter(int schritt) bzw. doSchritt(int schritt) und getAusgabe(int Schritt) dann kannst du auch dein Switching auch benutzen. Vielleicht denk ich auch grad vollkommen in die verkehrte Richtung
steinadler Geschrieben 4. Dezember 2006 Autor Geschrieben 4. Dezember 2006 Hm... also am Ende mĂŒsste es so ne Art Topf sein, wo ich paar Ablaufschritte reintun kann und bestimmen kann wie die nacheinander aufgerufen werden sollen, bzw. wie bei einer Verzweigung zu verfahren ist. AnschlieĂend drĂŒck ich auf Start und der Topf köchelt vor sich hin und fĂŒhrt die Schritte nacheinander aus. Jetzt möchte ich gern ne Basis-Klasse die quasi den Topf grob beschreibt. Und dann noch eine Steuerungsklasse, welche vom Topf erbt. Und die FunktionalitĂ€t der Schritte hinzufĂŒgt. Hinzu kommt die Sache, dass jeder Schritt vielleicht auch noch einen Parameter haben kann. Die Sache mit der Add()-Funktion finde ich ja genial, aber ich brĂ€uchte dann halt ne Möglichkeit, das, was sonst in 20 Funktionen stĂ€nde, in eine einzige zu packen.
TDM Geschrieben 4. Dezember 2006 Geschrieben 4. Dezember 2006 Ich wĂŒrde die Schritte mit einem Integer reprĂ€sentieren. Diese werden dann in einer Collection gespeichert. Durch die Methode doSchritt(int schritt) kannst du dann die einzelnen Schritte ausfĂŒhren. Es ist nur die Frage, ob du Zahlen eingeben lĂ€sst oder Text als Schrittaufruf.
steinadler Geschrieben 4. Dezember 2006 Autor Geschrieben 4. Dezember 2006 Die Eingabe findet am Ende höchstwahrscheinlich nicht statt. Das war nur als Beispiel. In den Schritten stehen BewegungsablĂ€ufe einer Maschine. Und was meinst du dazu, wenn ich die Schritte wie gehabt als einzelne Objekte mache und jedem eine ID gebe. Und anschlieĂend die ID's einem ENUM zuordne. Dann könnte ich ja nach ID's switchen.
TDM Geschrieben 4. Dezember 2006 Geschrieben 4. Dezember 2006 Zu viel Aufwand. Wenn du schon eine ID hast, dann kannst du die dann in einer Variable speichern und dann z.B. Folgendes machen: int ID = obj.getID(); switch (ID) { case MyClass.ID_one: //... break; case MyClass.ID_two: //... break; //... } WĂŒrd ich jedenfalls so meinen. Aber ist natĂŒrlich dir ĂŒberlassen
steinadler Geschrieben 4. Dezember 2006 Autor Geschrieben 4. Dezember 2006 Ja... wenn das funktionieren wĂŒrde. Aber man kann nur nach konstanten ints casen. Also 1,2,3,4, oder "a", "b",... aber nicht nach obj.ID oder so. Das ist ja das blöde.
TDM Geschrieben 4. Dezember 2006 Geschrieben 4. Dezember 2006 public class MyClass { static const int ID_one = 1; static const int ID_two = 2; } public class Luncher{ void run() { ... int ID = obj.getID(); switch (ID) { case MyClass.ID_one: //... break; case MyClass.ID_two: //... break; //... } } :mod:
steinadler Geschrieben 4. Dezember 2006 Autor Geschrieben 4. Dezember 2006 Danke schonmal. Hm... aber wo ist dann der Unterschied zum ENUM? :bimei
TDM Geschrieben 4. Dezember 2006 Geschrieben 4. Dezember 2006 Naja, Enumerations können auch Objekte als Typen enthalten (nur dass du wegen einem privaten Konstruktor keine zusÀtzlichen Objekte erzeugen kannst.) Hoffentlich hau ich jetzt nicht allzuviel zwischen Java und C# durcheinander.
steinadler Geschrieben 4. Dezember 2006 Autor Geschrieben 4. Dezember 2006 Also soweit ich c# jetzt verstanden habe, definiere ich nen enum folgender MaĂen: enum MyEnum { int R = 1, int G = 2, int B = 3 } und darauf zugreifen kann ich ĂŒber MyEnum m_eMy; m_eMy.R // -> ergibt 1
TDM Geschrieben 4. Dezember 2006 Geschrieben 4. Dezember 2006 ok, java-code ist wohl doch nicht das gleiche wie C# Dann halt so. Wieder was gelernt
Empfohlene BeitrÀge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto fĂŒr unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden