Skip to content

Kapitel 8: Objektorientierte Programmierung fortgeschritten

8.1 Vererbung

Grundlegende Vererbung

dart
class Tier {
  void essen() {
    print('Tier isst');
  }
}

class Hund extends Tier {
  // Erbt die essen()-Methode
}

Methodenüberschreibung

dart
class Tier {
  void geräusch() {
    print('Tier macht Geräusch');
  }
}

class Hund extends Tier {
  @override
  void geräusch() {
    print('Hund bellt');
  }
}

super-Schlüsselwort

dart
class Tier {
  String name;
  
  Tier(this.name);
  
  void vorstellen() {
    print('Ich bin ' + name);
  }
}

class Hund extends Tier {
  Hund(String name) : super(name);
  
  @override
  void vorstellen() {
    super.vorstellen();  // Ruft die Methode der Elternklasse auf
    print('Ich bin ein Hund');
  }
}

8.2 Kapselung

Zugriffsmodifikatoren

dart
class Person {
  String name;  // public (Standard)
  int _alter;    // private (mit _ beginnend)
  
  // getter
  int get alter => _alter;
  
  // setter
  set alter(int wert) {
    if (wert >= 0) {
      _alter = wert;
    }
  }
}

8.3 Polymorphismus

dart
class Tier {
  void geräusch() {
    print('Tier macht Geräusch');
  }
}

class Hund extends Tier {
  @override
  void geräusch() {
    print('Hund bellt');
  }
}

class Katze extends Tier {
  @override
  void geräusch() {
    print('Katze miaut');
  }
}

void main() {
  Tier tier1 = Hund();   // Elternklassen-Referenz zeigt auf Unterklassen-Objekt
  Tier tier2 = Katze();
  
  tier1.geräusch();  // Hund bellt
  tier2.geräusch();  // Katze miaut
}

8.4 Abstrakte Klassen und Schnittstellen

Abstrakte Klassen

dart
abstract class Form {
  double fläche();  // Abstrakte Methode
}

class Rechteck extends Form {
  double breite;
  double höhe;
  
  Rechteck(this.breite, this.höhe);
  
  @override
  double fläche() {
    return breite * höhe;
  }
}

Schnittstellen

dart
class Flugfähig {
  void fliegen();
}

class Vogel implements Flugfähig {
  @override
  void fliegen() {
    print('Vogel fliegt');
  }
}

8.5 Praxisbeispiel

dart
abstract class Mitarbeiter {
  String name;
  double gehalt;
  
  Mitarbeiter(this.name, this.gehalt);
  
  void arbeiten();
  
  void informationen() {
    print('Name: ' + name + ', Gehalt: ' + gehalt.toString());
  }
}

class Entwickler extends Mitarbeiter {
  Entwickler(String name, double gehalt) : super(name, gehalt);
  
  @override
  void arbeiten() {
    print('Entwickler schreibt Code');
  }
}

void main() {
  Mitarbeiter entwickler = Entwickler('Alice', 5000);
  entwickler.informationen();
  entwickler.arbeiten();
}

Frei für alle Anfänger