Modul 7 von 16 · 📖 7 min Lesezeit · ⏱ 30 min gesamt

FI-AE 07 Objektorientierte Programmierung

Inhaltsverzeichnis (6 Abschnitte)
  1. Konzepte und Hintergrund
  2. Architektur-Diagramm
  3. Praktische Schritte
  4. Häufige Fallstricke
  5. Weiterführende Ressourcen
  6. Wissens-Check

FI-AE 07 Objektorientierte Programmierung

Die objektorientierte Programmierung (OOP) bildet das Fundament moderner Softwareentwicklung. In diesem Modul vertiefen Sie die Kernkonzepte der OOP – Kapselung, Vererbung und Polymorphie – und lernen, diese anzuwenden, um robuste und wartbare Softwarearchitekturen zu entwerfen. Anhand eines durchgehenden Beispiels erarbeiten Sie sich praktische Fähigkeiten in der Anwendung der SOLID-Prinzipien, die die Basis für professionelles, erweiterbares Code-Design bilden.

Konzepte und Hintergrund

Kapselung
Die Kapselung verbirgt die internen Zustände und Implementierungen eines Objekts und macht nur über definierte Schnittstellen (Methoden) zugänglich. Sie schützt Daten vor unbefugtem Zugriff und reduziert Abhängigkeiten zwischen Komponenten.
Vererbung
Vererbung ermöglicht die Bildung neuer Klassen (abgeleitete Klassen) auf Basis bestehender Klassen (Basisklassen). Die abgeleitete Klasse erbt Eigenschaften und Methoden der Basisklasse und kann diese erweitern oder überschreiben.
Polymorphie
Polymorphie ("Vielgestaltigkeit") erlaubt es, Objekte verschiedener Klassen über eine gemeinsame Schnittstelle zu behandeln. Methoden können je nach Objekttyp unterschiedlich implementiert sein, was zur Laufzeit dynamisch aufgelöst wird.
SOLID-Prinzipien
Die SOLID-Prinzipien sind fünf Design-Richtlinien für objektorientierte Software: Single Responsibility Principle, Open/Closed Principle, Liskov Substitution Principle, Interface Segregation Principle und Dependency Inversion Principle. Sie gewährleisten flexible, wartbare und erweiterbare Systeme.

Architektur-Diagramm

classDiagram
  class Fahrzeug {
    +geschwindigkeit: int
    +position: Punkt
    +beschleune(delta: int)
    +bremsen(delta: int)
    +getPosition(): Punkt
  }
  
  class Punkt {
    +x: int
    +y: int
    +verschiebe(dx: int, dy: int)
  }
  
  class Auto extends Fahrzeug {
    +anzahlTueren: int
    +oeffneTuer(tuerNr: int)
  }
  
  class Motorrad extends Fahrzeug {
    +hatBeifahrer: boolean
    +setzeBeifahrer(status: boolean)
  }
  
  Fahrzeug "1" *-- "1" Punkt
  Fahrzeug <|-- Auto
  Fahrzeug <|-- Motorrad

Praktische Schritte

  1. Definieren Sie eine Basisklasse Fahrzeug mit gemeinsamen Attributen wie geschwindigkeit und position sowie Methoden zur Geschwindigkeitskontrolle. Dies legt den Grundstein für spätere Vererbung.
  2. Implementieren Sie die Kapselung durch Zugriffsmodifikatoren (z.B. private für interne Daten und public für Methoden), um direkten Zugriff auf Objektzustände zu verhindern.
  3. Leiten Sie spezifische Klassen wie Auto und Motorrad von der Basisklasse Fahrzeug ab und fügen Sie klassenspezifische Attribute und Methoden hinzu.
  4. Überschreiben Sie Methoden der Basisklasse in den abgeleiteten Klassen, um polymorphes Verhalten zu realisieren – z.B. unterschiedliche Implementierungen der beschleune-Methode.
  5. Wenden Sie das Single Responsibility Principle an, indem Sie separate Klassen für verschiedene Verantwortlichkeiten erstellen (z.B. Punkt für Positionsdaten).
  6. Implementieren Sie das Open/Closed Principle, indem Sie die Basisklasse so gestalten, dass sie erweitert, aber nicht geändert werden muss.
  7. Verwenden Sie Interfaces, um das Interface Segregation Principle zu erfüllen – z.B. ein IFahrzeug-Interface mit nur den notwendigen Methoden.
  8. Wenden Sie Dependency Injection an, um Abhängigkeiten von konkreten Implementierungen zu lösen und das Dependency Inversion Principle zu realisieren.

Häufige Fallstricke

Weiterführende Ressourcen

Wissens-Check

Vier Fragen zur Selbstkontrolle. Klicken Sie jede Frage an, um die richtige Antwort und Erklärung zu sehen.

Was ist der Hauptzweck der Kapselung in der objektorientierten Programmierung?
  • A) Maximale Wiederverwendbarkeit von Code durch Vererbung
  • B) Verbergen interner Implementierungsdetails und Schutz von Daten
  • C) Erleichterung der Kommunikation zwischen verschiedenen Objekten
  • D) Reduzierung der Anzahl von Klassen in einem System

Richtige Antwort: B. Kapselung verbirgt interne Zustände und macht nur über definierte Schnittstellen zugänglich, während A und C eher andere OOP-Konzepte betreffen und D nicht das Hauptziel ist.

Welches SOLID-Prinzip besagt, dass eine Klasse nur einen Grund zur Änderung haben sollte?
  • A) Open/Closed Principle
  • B) Interface Segregation Principle
  • C) Single Responsibility Principle
  • D) Liskov Substitution Principle

Richtige Antwort: C. Das Single Responsibility Principle besagt, dass eine Klasse nur eine einzige Verantwortung haben sollte, während A sich auf Erweiterbarkeit, B auf spezifische Schnittstellen und D auf Austauschbarkeit von Objekten bezieht.

Was bedeutet Polymorphie im Kontext der objektorientierten Programmierung?
  • A) Die Fähigkeit einer Klasse, von einer anderen Klasse zu erben
  • B) Die Fähigkeit von Objekten, sich während der Laufzeit zu ändern
  • C) Die Fähigkeit, Methoden mit demselben Namen aber unterschiedlicher Implementierung zu haben
  • D) Die Fähigkeit, Daten und Methoden in einer Klasse zu bündeln

Richtige Antwort: C. Polymorphie ermöglicht es, Methoden mit gleichem Namen aber unterschiedlicher Implementierung zu haben, die je nach Objekttyp aufgerufen werden, während A Vererbung, B nicht möglich und D Kapselung beschreibt.

Welcher Vorteil ergibt sich aus der Anwendung des Open/Closed-Prinzips?
  • A) Reduzierung der Anzahl von Klassen im System
  • B) Einfachere Implementierung von Vererbungshierarchien
  • C) Erweiterbarkeit von Systemen ohne Änderung bestehender Komponenten
  • D) Vereinfachung der Benutzeroberfläche

Richtige Antwort: C. Das Open/Closed-Prinzip ermöglicht die Erweiterung von Systemen ohne Änderung bestehender Komponenten, während A, B und D keine direkten Ergebnisse dieses Prinzips sind.