Sobes.tech
Junior

Was ist Überschreiben (Overriding) in der Programmierung?

sobes.tech KI

Antwort von AI

Method Overriding (Überschreiben) ist die Möglichkeit einer Unterklasse, ihre eigene Implementierung einer Methode bereitzustellen, die bereits in ihrer Elternklasse definiert ist. Die Signatur der überschriebenen Methode (Name, Anzahl und Typen der Parameter) in der Unterklasse muss vollständig mit der Signatur der Methode in der Elternklasse übereinstimmen. Der Rückgabetyp muss ebenfalls entweder derselbe sein oder kovariant (Untertyp) des Rückgabetyps der Elternmethode.

Wichtige Aspekte des Überschreibens:

  • Vererbung: Überschreiben ist nur im Kontext von Vererbungsverhältnissen möglich, bei denen die Unterklasse eine Methode von der Oberklasse erbt.
  • Polymorphismus: Überschreiben ist einer der Mechanismen zur Implementierung von Laufzeitpolymorphismus (runtime polymorphism). Das bedeutet, dass je nach tatsächlichem Objekttyp, der über eine Referenz auf den Elterntyp aufgerufen wird, die entsprechende Methodenausführung erfolgt (entweder aus der Eltern- oder aus der Kindklasse).
  • Schlüsselwort @Override: In einigen Sprachen (z.B. Java) wird die Annotation @Override verwendet. Sie ist nicht zwingend erforderlich für eine korrekte Überschreibung, wird aber empfohlen, um die Lesbarkeit des Codes zu verbessern und Compilerfehler zu vermeiden, wenn die Methode nicht den Überschreibungsregeln entspricht.
  • Zugriff auf die Elternmethode: Innerhalb der überschriebenen Methode in der Unterklasse ist es oft notwendig, die Implementierung derselben Methode aus der Elternklasse aufzurufen. Dafür wird das Schlüsselwort super verwendet (z.B. super.methode()).

Beispiel in Java:

// Elternklasse
class Animal {
    // Methode in der Elternklasse
    void makeSound() {
        System.out.println("Das Tier macht ein Geräusch");
    }
}

// Unterklasse, die von Animal erbt
class Dog extends Animal {
    // Überschreiben der Methode makeSound()
    @Override
    void makeSound() {
        System.out.println("Wuff wuff!");
    }

    // Beispiel für den Aufruf der Elternmethode
    void eat() {
        System.out.println("Der Hund frisst.");
        super.makeSound(); // Ruft die Methode aus der Elternklasse auf
    }
}

class Main {
    public static void main(String[] args) {
        Animal myAnimal = new Animal();
        Animal myDog = new Dog(); // Polymorphismus

        myAnimal.makeSound(); // Gibt aus: Das Tier macht ein Geräusch
        myDog.makeSound();   // Gibt aus: Wuff wuff! (Aufruf der überschriebenen Methode)

        Dog specificDog = new Dog();
        specificDog.eat(); // Gibt aus: Der Hund frisst. 
                          // Das Tier macht ein Geräusch
    }
}

Beispiel in Python:

# Elternklasse
class Animal:
    # Methode in der Elternklasse
    def make_sound(self):
        print("Das Tier macht ein Geräusch")

# Unterklasse, die von Animal erbt
class Dog(Animal):
    # Überschreiben der Methode make_sound()
    def make_sound(self):
        print("Wuff wuff!")

    # Beispiel für den Aufruf der Elternmethode
    def eat(self):
        print("Der Hund frisst.")
        super().make_sound() # Ruft die Methode aus der Elternklasse auf

# Demonstration
my_animal = Animal()
my_dog = Dog() # Polymorphismus

my_animal.make_sound() # Gibt aus: Das Tier macht ein Geräusch
my_dog.make_sound()   # Gibt aus: Wuff wuff!

specific_dog = Dog()
specific_dog.eat() # Gibt aus: Der Hund frisst. 
                      # Das Tier macht ein Geräusch

Das Überschreiben wird verwendet, um das Verhalten der Basisklasse an die Spezifika der Unterklasse anzupassen, während die allgemeine Schnittstelle beibehalten wird. Es ist ein Schlüsselelement des objektorientierten Designs.