Robert Bienert: Abstrakte Klassen - wozu?

Beitrag lesen

Moin!

abstrakte Klassen (oder auch "Interfaces") sind ja offenbar ganz wichtig - und wie sie funktionieren, habe ich (hoffentlich!) auch soweit verstanden. Aber warum sie so wichtig sind, ist mir ein Rätsel!

So sehe ich das auch, so genannte „virtuelle Klassen“ wie in C++ sind IMHO zweckmäßiger, auch wenn formale Mängel (die wohl eher für Interfaces sprechen) dagegen sprechen.

Im Grunde lässt sich damit ja eine Schnittstelle definieren, die dann von Objekten ähnlicher Art implementiert wird. Also bspw. eine abstrakte Klasse "Farbinformationen" mit der Eigenschaft "Farbe" und den Methoden "setFarbe" und "getFarbe".
Zwei Klassen "Auto" und "Orange" könnten diese abstrakte Klasse dann verwenden, richtig?

So sieht es aus. Mit der Angabe, dass diese Klasse ein bestimmtes Interface implementiert, musst du alle geforderten Methoden in der Klasse definieren.

Trotzdem muss ich doch nach wie vor fuer "Orange" und "Auto" den Code komplett entwickeln! Arbeit spare ich mir also schon mal nicht! Was also ist der große Vorteil???

Genau das frage ich mich auch. In C++ mit den genannten virtuellen Klassen definierst du eine Klasse komplett mit Methoden (inklusive Code) und Daten, gibst jedoch vor, dass bestimmte Methoden von Subklassen selbst implementiert werden, d.h. nur diese paar speziellen Methoden musst du jedesmal neu schreiben, aber nicht alles. Das ganze sieht dann in etwa so aus:

  
class VirtuelleBasis {  
public:  
    // Konstruktor  
    VirtuelleBasis(const int initWert) : einWert(initWert) {}  
    // virtueller Destruktor, bei Subklassen sinnvoll  
    ~VirtuelleBasis();  
  
    // Diese Methode ist virtuell, die Angabe = 0 signalisiert,  
    // dass sie überschrieben (implementiert) werden muss  
    // („NULL-Pointer in der Tabelle virtueller Methoden“)  
    virtual interfaceMethode() = 0;  
  
protected:  
    int einWert;  
    double nochEiner;  
};  
  
class Abgeleitet : public VirtuelleBasis {  
    // enthält alle Daten und Methoden der Basisklasse  
    // braucht nur folgendes zu implementieren:  
    virtual interfaceMethode() {  
         // …  
    }  
};  

Viele Grüße,
Robert