Paradigmen der Programmierung

Was ist objektorientierte Programmierung (OOP)?

OOP, Object-Oriented Programming

Objektorientierte Programmierung ist ein Paradigma, bei dem Daten und die darauf arbeitenden Funktionen in Objekten zusammengefasst werden, die nach dem Bauplan einer Klasse entstehen und über ihre Methoden miteinander sprechen.

Klassen, Objekte und Vererbung begegnen dir in Java, C#, C++ und Python gleichermaßen, und wer sie einmal richtig sortiert hat, liest fremden Code deutlich schneller.

KI-generiertDieses Bild wurde mit KI erzeugt · Yves Hoppe / KI / cmt
Vier Begriffe
Kapselung, Abstraktion, Vererbung, Polymorphie
Grundeinheit
Objekt als Instanz einer Klasse
Faustregel
Komposition vor Vererbung
Abgegrenzt von
Prozeduraler und funktionaler Programmierung

Die vier Begriffe, um die es geht

Eine Klasse ist der Bauplan, ein Objekt die einzelne Ausprägung davon zur Laufzeit. Die Klasse Konto beschreibt, dass es einen Saldo und eine Methode abheben gibt, das Objekt kennt den konkreten Saldo dieses einen Kontos.

Kapselung heißt, dass der Zustand nur über Methoden erreichbar ist. Ein Saldo, der von außen frei gesetzt werden kann, ist keine Kapselung, auch nicht mit Getter und Setter darum herum. Der Sinn ist, dass die Klasse ihre eigenen Regeln durchsetzt, etwa dass eine Abhebung den vereinbarten Rahmen nicht überschreiten darf.

Vererbung bildet eine Ist-ein-Beziehung ab, und Polymorphie ist der Grund, warum sich das lohnt: Der aufrufende Code arbeitet gegen die Basisklasse oder das Interface. Welche konkrete Ausprägung dahintersteht, entscheidet sich erst zur Laufzeit. In C# passiert das über virtual und override, in C++ über virtuelle Methoden.

Wo Vererbung kippt

Der klassische Fehler ist, Vererbung für Wiederverwendung zu benutzen statt für Austauschbarkeit. Sobald eine abgeleitete Klasse eine geerbte Methode überschreibt, um sie wirkungslos zu machen oder eine Ausnahme zu werfen, stimmt die Ist-ein-Beziehung nicht mehr, und jeder Aufrufer muss Sonderfälle kennen.

Die Alternative heißt Komposition: Die Klasse enthält ein Objekt, das die gewünschte Fähigkeit hat, und reicht Aufrufe weiter. Das kostet mehr Tipparbeit, bleibt dafür deutlich beweglicher, weil sich der Bestandteil zur Laufzeit austauschen lässt. Als Faustregel ist eine tiefe Klassenhierarchie fast immer ein Warnzeichen.

OOP in C# und C++

Die Sprachen setzen dasselbe Modell unterschiedlich um, und die Unterschiede fallen im Alltag auf. C# kennt nur Einfachvererbung, dafür beliebig viele Interfaces, und der Garbage Collector räumt Objekte weg. In C++ gibt es Mehrfachvererbung, dafür entscheidest du selbst über Lebensdauer und Besitz, üblicherweise über RAII und Smart Pointer.

Auch die Polymorphie kostet unterschiedlich: In C++ ist ein Methodenaufruf nur dann dynamisch, wenn du ihn als virtual deklarierst, sonst wird direkt gebunden. In C# sind Interfacemethoden immer dynamisch. Wer aus der einen Sprache in die andere wechselt, stolpert meist genau hier.

KI-generiertDieses Bild wurde mit KI erzeugt · Yves Hoppe / KI / cmt
Nicht verwechseln

Objektorientierte Programmierung und was oft damit gleichgesetzt wird

Objektorientierte Programmierung gegen Prozedurale Programmierung

Dort liegen Daten und Funktionen getrennt, Funktionen bekommen Datenstrukturen übergeben. Bei OOP gehört beides zusammen, und die Art des Objekts bestimmt, welche Umsetzung aufgerufen wird.

Objektorientierte Programmierung gegen Funktionale Programmierung

Sie arbeitet mit unveränderlichen Werten und Funktionen ohne Seiteneffekte, statt Zustand in Objekten zu halten. C# hat vieles davon aufgenommen, etwa Records und LINQ, und F# ist von Haus aus funktional.

KI-generiertDieses Bild wurde mit KI erzeugt · Yves Hoppe / KI / cmt
In der Praxis

Vererbung ist die Bindung, die du am schwersten wieder loswirst

Eine Klasse, die von einer anderen erbt, hängt an deren Innenleben. Ändert die Basisklasse ihr Verhalten, ändern sich alle Nachfahren mit, und in einer Hierarchie über fünf Ebenen findest du die Stelle, an der eine Methode tatsächlich definiert ist, nur noch über die Sprungfunktion der Entwicklungsumgebung. Deshalb ist ein übergebenes Objekt, das die Aufgabe erledigt, in den meisten Fällen die haltbarere Lösung.

Der zweite Punkt ist das Versprechen der Basisklasse. Wenn eine abgeleitete Klasse eine geerbte Methode mit einer Ausnahme beantwortet, weil dieser Fall bei ihr nicht vorgesehen ist, bricht jeder Code, der mit der Basisklasse arbeitet. Vererbung sagt zu, dass das Neue überall dort einsetzbar ist, wo bisher das Alte stand, und diese Zusage musst du halten.

Zwischen den Sprachen liegen dabei Welten. In C# erbst du von genau einer Klasse und beliebig vielen Schnittstellen, und die Speicherfreigabe übernimmt die Laufzeitumgebung. In C++ ist Mehrfachvererbung erlaubt, und ein fehlender virtueller Destruktor sorgt dafür, dass beim Löschen über einen Zeiger auf die Basisklasse der abgeleitete Teil nicht aufgeräumt wird.

Objektorientierte Programmierung lernen

Wie sich Klassen, Interfaces und Speicherverwaltung in beiden Sprachen konkret unterscheiden, arbeiten die Trainings zu C# und C++ nebeneinander durch.

Wer das Paradigma erst einmal unabhängig von einer Sprache verstehen will, ist in den sprachübergreifenden Programmierkursen richtig.

Häufige Fragen

Sind Getter und Setter für jedes Feld guter Stil?
Selten. Wenn zu jedem Feld ein Paar existiert, ist das Objekt nur eine Datenstruktur mit Zeremonie. Besser sind Methoden, die einen fachlichen Vorgang ausdrücken, also einzahlen statt setzeSaldo. Für reine Datenträger nimmst du in C# gleich einen Record.
Wann nehme ich ein Interface, wann eine abstrakte Klasse?
Ein Interface beschreibt eine Fähigkeit ohne Implementierung und lässt sich beliebig oft ergänzen. Eine abstrakte Klasse bietet gemeinsamen Code und geteilten Zustand, verbraucht in C# aber die eine Basisklasse, die du hast.
Ist OOP überholt?
Nein, aber der Alleinvertretungsanspruch ist weg. Gängige Codebasen mischen: Objekte für langlebigen Zustand und Fachregeln, funktionale Stilmittel für Datentransformationen. Beides in einer Datei ist heute normal und kein Bruch.
Persönlich für dich da

Deine Ansprechpartner

Du willst das Thema nicht nur nachschlagen, sondern anwenden können? Wir beraten dich persönlich und kostenlos.

Yves Hoppe

Yves Hoppe

Weiterbildung & Beratung

Ordnet mit dir ein, welcher Kurs zu deinem Vorwissen passt.

Norbert Jansen

Norbert Jansen

Beratung & Inhouse

Plant Inhouse-Trainings, die an euren eigenen Daten und Abläufen ansetzen.

Objektorientierte Programmierung im Kurs statt im Lexikon

Nachschlagen bringt dich bis zum Verstehen. Anwenden lernst du an echten Aufgaben.