Zum Inhalt springen

Überschreiben von Methoden ohne extra Klasse


Empfohlene Beiträge

Geschrieben

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

Geschrieben
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.

Geschrieben

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!?!?!

Geschrieben
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 :)

Geschrieben

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.

Geschrieben
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".

Geschrieben

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");

}

Geschrieben
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.
Geschrieben

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!

Geschrieben

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!!?!?

Geschrieben

;-) 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!

Geschrieben
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.

Geschrieben

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 :P:D )

Also vielen Dank habt mir echt geholfen!

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...