Was ist objektorientierte Programmierung?

Mancher wird sich wundern, wieso objektorientierte Programmierung jetzt erst im Tutorial auftaucht, schließlich sind Klassen bereits bekannt und auch Information-Hiding (public, protected, private) ist bereits vorgekommen. Auch wenn man es von Lehrern an Schulen oder Professoren an den Hochschulen so beigebracht bekommt, dass dies Teile der objektorientierten Programmierung wären - alles Quatsch! Bisher tauchte im Tutorial noch überhaupt keine objektorientierte Programmierung auf.

Das wollen wir nun ändern. Beginnen wir damit, uns zunächst bewusst zu machen, was OOP überhaupt ist. Wenn wir uns an einem Objekt orientieren, dann müssen wir das Objekt fragen, welche Art Objekt es denn gerne sein möchte.

Schauen wir uns noch einmal das Beispiel aus der klassenorientierten Programmierung an:

class Tier
{
public:
  char Name[64];
  int  Fellfarbe;
  int  KrallenLaenge;
  int  AnzahlBeine;
 
  inline void GibNamenAus( void ) { printf( "Ich heiße %s\n", Name );
};
 
class Hund : public Tier
{
public:
  int  GefangeneKatzen;
 
  inline void GibLaut( void ) { printf( "Wau!\n" ); }
};
 
class Katze : public Tier
{
public:
  int   GefangeneVoegel;
 
  inline void GibLaut( void ) { printf( "Miau!\n" ); }
};
 
class Amsel : public Tier
{
public:
  int  GefangeneInsekten;
 
  inline void GibLaut( void ) { printf( "Piep!\n" ); }
};

Wir haben nun das Problem, dass zwar Hund, Katze und Amsel einen individuellen Laut ausgeben können, aber nur dann, wenn man bereits weiß, um welches Tier es sich handelt.

Stellen wir uns vor, wir haben eine Liste mit Zeigern auf Tiere und wollen nun jedes Tier auffordern, den für seine Art individuellen Laut auszugeben. Die Klasse Tier kennt 'GibLaut' jedoch nicht.

Damit das funktioniert, muss die Funktion in der Klasse Tier bekannt sein und die Klasse Tier muss unterscheiden können, welche Art Tier sie darstellt:

enum ObjType
{
  OBJTYPE_CAT,
  OBJTYPE_DOG,
  OBJTYPE_BLACKBIRD  
};
 
struct Tier
{
  ObjType Type;
 
  char Name[64];
  int  Fellfarbe;
  int  KrallenLaenge;
  int  AnzahlBeine;
 
  Tier( ObjType type ) : Type( type ) {}
 
  inline void GibNamenAus( void ) { printf( "Ich heiße %s\n", Name );
  void GibLaut( void );
};

Der Konstruktor der einzelnen Ableitungen muss nun den ObjektTypen zuweisen. Als Beispiel:

class Katze : public Tier
{
public:
  int   GefangeneVoegel;
 
  Katze() : Tier( OBJTYPE_CAT ) {}
};

Eine Instanz von Tier, beschreibt mit Type die Art des Objektes, die es darstellt. Nun kann man Funktionen schreiben, die objektorientiert arbeiten:

  void Tier::GibLaut( void ) 
  { 
    switch( Type )
    {
      case OBJTYPE_CAT: printf( "Miau!\n" ); break;
      case OBJTYPE_DOG: printf( "Wau!\n" ); break;
      case OBJTYPE_BLACKBIRD: printf( "Piep!\n" ); break;
      default: printf( "<unverständliches Geräuch>\n" ); break;
    }
  }

Das ist Objektorientiert. Denn in Abhängigkeit des Objektes handelt die Funktion GibLaut() unterschiedlich. Die Funktion orientiert sich am Objekt. Und wichtig ist, dass hier nichts verwendet wurde, was C++ erfordert 1), denn objektorientierte Programmierung ist auch in C möglich. Und um zu verstehen, was OOP ist, werden wir uns OOP in C anschauen und dann sehen, wie C++ uns dabei unterstützt.

1) man könnte GibLaut in C schließlich auch eine struct Tier * übergeben