JeFi Geschrieben 26. September 2005 Geschrieben 26. September 2005 Hallo! Ich habe folgendes Problem ich möchte von einer Klasse Methoden überschreiben ohne eine extra Klasse anlegen zu müssen. Beispiel: class Mensch{ string sName; public: Mensch(string name){ sName=name; } }; Jetzt möchte ich 2 Objekte der Klasse Mensch erzeugen eins davon ganz normal und das andere Objekt so sich etwas anders verhalten. int main(){ Mensch m1("Hansi"); Mensch m2("Mama"){ Mensch(string name){ sName=name+name; } }; } Wie ich m2 erzeugt habe kenne ich das aus Java aber in C++ scheint sowas nicht zu gehen!!! Nun möchte ich aber nicht extra eine neue Klasse anlegen müssen nur weil eine Methode anders reagieren soll!!! Kann mir da jemand helfen!?! vielen Dank im Voraus Zitieren
Klotzkopp Geschrieben 26. September 2005 Geschrieben 26. September 2005 ich möchte von einer Klasse Methoden überschreiben ohne eine extra Klasse anlegen zu müssen. Das geht in C++ nicht. Persönlich finde ich, das so etwas schlechtes Design kaschiert. Beim Programmieren kommt man an eine Stelle: "Ich brauch hier grad mal was, das sich anders verhält." Darüber hätte man sich während der Designphase Gedanken machen sollen. Dann bräuchte man keine "extra" Klasse, sondern die wäre schon da. Wie gesagt, persönlich. C# hat so etwas ab .NET 2.0 auch. Zitieren
JeFi Geschrieben 26. September 2005 Autor Geschrieben 26. September 2005 Hallo und danke für die schnelle Antwort! Ja in diesem Beispiel sehe ich das genauso! Aber gehen wir mal davon aus das wir ein GUI Programm schreiben, welches 2 Buttons besitzt (der eine soll beim anklicken Daten aus einer Datei auslesen und in eine Tabelle schreiben und der 2. soll Daten aus einer Datei in die Tabelle speichern. Jetzt müsste ich um das Umsetzen zu können 2 Klassen schreiben die sich nur im Inhalt einer Methode unterscheiden. Und wenn wir jetzt mal davon ausgehen, dass unser Programm größer wird benötigen wir dann vielleicht 30 Buttons und somit auch 30 Klassen und diese Klassen unterscheiden sich nur im Inhalt einer Methode und das finde ich auch nicht wirklich schön oder!?!?! Zitieren
perdian Geschrieben 26. September 2005 Geschrieben 26. September 2005 Persönlich finde ich, das so etwas schlechtes Design kaschiert. Beim Programmieren kommt man an eine Stelle: "Ich brauch hier grad mal was, das sich anders verhält." Darüber hätte man sich während der Designphase Gedanken machen sollen.Es wird sogar IMHO noch schlimmer, und erschwert die Fehlersuche extrem. Stellen wir uns mal vor, ich habe eine Klasse Foo mit der Methode Bar. Ich gehe überall, wo ich ein Objekt vom Typ Foo bekomme davon aus, dass sich Bar so verhält, wie es in der (doch hoffentlich vorhandenen) Dokumentation beschrieben worden ist. Wenn jetzt allerdings in Projekt1 Foo.Bar() ein komplett anderes Ergebnis liefert als Foo.Bar() in Projekt2 - wo bleibt dann noch die Struktur und Übersichtlichkeit meines Programmes? Richtig: Auf der Strecke. friend ist schon schlimm genug Zitieren
JeFi Geschrieben 26. September 2005 Autor Geschrieben 26. September 2005 Naja vielleicht war das erste Beispiel nur schlecht gewählt!!! Sollte eigentlich nur mein Problem erläutern! Denn wenn wir jetzt mal beim Button bleiben hat ja eine Methode die auf einen Button klick reagiert noch keinen Inhalt und deshalb ist es da schon eindeutiger! Und ich finde deshalb die Sache aus Java nicht schlecht und wesentlich übersichtlicher als wenn ich 30 Klassen anlegen muss die quasi nix wirklich eigenes haben aus die Reaktion auf den Buttonklick. Zitieren
Klotzkopp Geschrieben 26. September 2005 Geschrieben 26. September 2005 Denn wenn wir jetzt mal beim Button bleiben hat ja eine Methode die auf einen Button klick reagiert noch keinen Inhalt und deshalb ist es da schon eindeutiger!Und wieso brauchst du da unterschiedliche Klassen? Es reicht doch, jede Instanz der Button-Klasse mit hinreichend vielen Informationen auszustatten, so dass sie z.B. ein Command-Objekt erstellen kann. Wenn die eigentlich Arbeit eines Programms in irgendwelchen UI-Klassen abläuft, ist IMHO schon beim Design etwas schief gelaufen. Es gibt Methoden und Modelle, um so etwas sauber zu lösen. Sicher ist es bequem, mit anonymen Methoden (so heißen die bei C#) mal eben ein anderes Verhalten hinzubasteln, wo man es gerade braucht. Aber damit zieht man eine tiefe Schneise quer durchs Design. So ein Feature hilft durchaus, wenn man kein - oder nur ein schlechtes - Design hat. Das meinte ich mit "kaschieren". Zitieren
JeFi Geschrieben 26. September 2005 Autor Geschrieben 26. September 2005 Wie meinst du das mit dem Command-Objekt?! Na ich bräuchte doch 2 bzw 30 Klassen wenn die Buttons unterschiedliche Aufgaben haben. quasi so unter qt falls euch das was sagt void Klasse1::mousePressEvent ( QMouseEvent * e ) { this->setText("Hallo"); } void Klasse2::mousePressEvent ( QMouseEvent * e ) { this->setText("Hallo2"); } Zitieren
Klotzkopp Geschrieben 26. September 2005 Geschrieben 26. September 2005 Wie meinst du das mit dem Command-Objekt?!Das war nur ein Beispiel. Na ich bräuchte doch 2 bzw 30 Klassen wenn die Buttons unterschiedliche Aufgaben haben.Nein, brauchst du nicht. Gerade in deinem Beispiel reicht es doch völig aus, wenn jede Instanz weiß, mit welchem Parameter sie setText aufrufen muss. Dazu brauchst du nicht mehr als eine Membervariable. Es ist IMHO komplett sinnlos, dafür unterschiedliche Klassen zu benutzen. Zitieren
JeFi Geschrieben 26. September 2005 Autor Geschrieben 26. September 2005 Die Methode mousePressEvent ( QMouseEvent * e ) ist aber eine Methode aus der Klasse QPushButton und diese wird automatisch aufgerufen wenn ich den Button anklicke.(ein MouseEvent würde ausgelöst werden) Wenn ich den jetzt anders parametrisieren würde mousePressEvent ( QMouseEvent * e, QString s ) dann würde das nichts bringen weil er weiterhin die mousePressEvent ( QMouseEvent * e ) Methode ausrufen würde! Und nun sollte er halt unterschiedlich reagieren wenn diese Methode aufgerufen wird(dazu ist sie ja auch da) und dann würde mir ja nur übrig bleiben diese Methode jedes mal zu überschreiben(wie das in Java auch der Fall ist) blos das ich wohl nicht wie in Java eine anonyome Klasse erzeugen kann sonder ich muss eine extra Klasse schreiben und das halte ich in diesem Falle nicht für sinnvoll und umständlicher! Zitieren
Guybrush Threepwood Geschrieben 26. September 2005 Geschrieben 26. September 2005 Nein du hast das nicht verstanden. void Klasse1::mousePressEvent ( QMouseEvent * e ) { this->setText(this->szText); } [/PHP] und für jeden Button den du mit dieser einen Klasse anlegst füllst du den Text entsprechend. Zitieren
JeFi Geschrieben 26. September 2005 Autor Geschrieben 26. September 2005 Ja da habe ich dich schon verstanden! Aber was ist wenn einer einen Text setzt und der andere einen Text ausliest wieder ein anderer stelle ne DB connection her usw was dann!!?!? Zitieren
Guybrush Threepwood Geschrieben 26. September 2005 Geschrieben 26. September 2005 Was soll dann sein? PS: Es reicht auch ein Satzzeichen Zitieren
JeFi Geschrieben 26. September 2005 Autor Geschrieben 26. September 2005 ;-) OKI werde mir Mühe geben! Na dann könnte ich das doch nicht so machen wie in deinem Beispiel machen! Und müsste dann für jeden Button eine extra Klasse anlegen! Zitieren
Klotzkopp Geschrieben 26. September 2005 Geschrieben 26. September 2005 Ja da habe ich dich schon verstanden! Aber was ist wenn einer einen Text setzt und der andere einen Text ausliest wieder ein anderer stelle ne DB connection her usw was dann!!?!? Dann kannst du Z.b. einen Command Handler-Singleton benutzen. void Klasse1::mousePressEvent ( QMouseEvent * e ) { CommandHandler::GetInstance().DoCommand(this); } void CommandHandler::DoCommand(Klasse1 const* source) { switch(source->id) // oder ein anderes Unterscheidungsmerkmal { case wasweisich: source->SetText(source->szText); break; // usw. [/code] Du kaufst dir ja auch nicht jeden Tag eine neue Küche, nur weil du jeden Tag etwas anderes kochst. Zitieren
Guybrush Threepwood Geschrieben 26. September 2005 Geschrieben 26. September 2005 Oder du unterscheidest direkt in der mousePressEvent Funktion was getan werden soll und sparst so eine extra Funktion. Allerdings muss ich dazu sagen das ich das alles nicht so sonderlich toll finde. Ich würde das ohne Klassen lösen, aber das ist nur meine Meinung Zitieren
JeFi Geschrieben 26. September 2005 Autor Geschrieben 26. September 2005 Hmmmm ja aber wirklich schön finde ich das so auch nicht da hätte ich doch schon am liebsten meine anonymen Klassen! Aber da es unter C++ sowas wohl nicht gibt muss ich wohl so in der Art das ganze lösen!(Naja C++ ist halt kein Java ) Also vielen Dank habt mir echt geholfen! Zitieren
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.