steinadler Geschrieben 4. Dezember 2006 Teilen 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. } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mister A Geschrieben 4. Dezember 2006 Teilen 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
steinadler Geschrieben 4. Dezember 2006 Autor Teilen 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 4. Dezember 2006 Teilen 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
steinadler Geschrieben 4. Dezember 2006 Autor Teilen 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 4. Dezember 2006 Teilen 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 ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
steinadler Geschrieben 4. Dezember 2006 Autor Teilen 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 4. Dezember 2006 Teilen 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
steinadler Geschrieben 4. Dezember 2006 Autor Teilen 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 } } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 4. Dezember 2006 Teilen Geschrieben 4. Dezember 2006 Und was machst du nach dem switch mit Aktuell? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 4. Dezember 2006 Teilen 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
steinadler Geschrieben 4. Dezember 2006 Autor Teilen 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 4. Dezember 2006 Teilen 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
steinadler Geschrieben 4. Dezember 2006 Autor Teilen 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 4. Dezember 2006 Teilen 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
steinadler Geschrieben 4. Dezember 2006 Autor Teilen 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 4. Dezember 2006 Teilen 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
steinadler Geschrieben 4. Dezember 2006 Autor Teilen 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 4. Dezember 2006 Teilen 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
steinadler Geschrieben 4. Dezember 2006 Autor Teilen 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 4. Dezember 2006 Teilen 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: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
steinadler Geschrieben 4. Dezember 2006 Autor Teilen Geschrieben 4. Dezember 2006 Danke schonmal. Hm... aber wo ist dann der Unterschied zum ENUM? :bimei Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 4. Dezember 2006 Teilen 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
steinadler Geschrieben 4. Dezember 2006 Autor Teilen 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 4. Dezember 2006 Teilen Geschrieben 4. Dezember 2006 ok, java-code ist wohl doch nicht das gleiche wie C# Dann halt so. Wieder was gelernt Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.