Sobes.tech
Junior

Ce este suprascrierea (Overriding) în programare?

sobes.tech AI

Răspuns de la AI

Suprascrierea metodei (Overriding) reprezintă posibilitatea unei subclase de a furniza propria sa implementare a unei metode care este deja definită în clasa sa părinte. Semnătura metodei suprascrise (numele, numărul și tipurile de parametri) în subclasă trebuie să coincidă complet cu semnătura metodei din clasa părinte. Tipul de returnare trebuie să fie de asemenea același sau covariant (subtip) față de tipul de returnare al metodei din clasa părinte.

Aspecte principale ale suprascrierii:

  • Moștenire: Suprascrierea este posibilă doar în contextul relațiilor de moștenire, unde subclasa moștenește o metodă de la superclasă.
  • Polimorfism: Suprascrierea este unul dintre mecanismele de implementare a polimorfismului la timpul de execuție (runtime polymorphism). Aceasta înseamnă că, în funcție de tipul real al obiectului, apelat printr-o referință la tipul părinte, se va executa implementarea corespunzătoare a metodei (fie cea a părintelui, fie cea a copilului).
  • Cuvântul cheie @Override: În unele limbi (de exemplu, Java), se folosește adnotarea @Override. Nu este obligatorie pentru funcționarea corectă a suprascrierii, dar este recomandată pentru a îmbunătăți lizibilitatea codului și a preveni erorile de compilare dacă metoda nu respectă regulile de suprascriere.
  • Accesul la metoda părintelui: În interiorul metodei suprascrise în subclasă, este adesea necesar să se apeleze implementarea aceleiași metode din clasa părinte. Pentru aceasta se folosește cuvântul cheie super (de exemplu, super.metoda()).

Exemplu în Java:

// Clasa părinte
class Animal {
    // Metoda în clasa părinte
    void makeSound() {
        System.out.println("Animalul face un sunet");
    }
}

// Clasa copil care moștenește de la Animal
class Dog extends Animal {
    // Suprascrierea metodei makeSound()
    @Override
    void makeSound() {
        System.out.println("Ham ham!");
    }

    // Exemplu de apelare a metodei părintelui
    void eat() {
        System.out.println("Câinele mănâncă.");
        super.makeSound(); // Apelăm metoda din clasa părinte
    }
}

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

        myAnimal.makeSound(); // Va afișa: Animalul face un sunet
        myDog.makeSound();   // Va afișa: Ham ham! (Se apelează metoda suprascrisă)

        Dog specificDog = new Dog();
        specificDog.eat(); // Va afișa: Câinele mănâncă. 
                          // Animalul face un sunet
    }
}

Exemplu în Python:

# Clasa părinte
class Animal:
    # Metoda în clasa părinte
    def make_sound(self):
        print("Animalul face un sunet")

# Clasa copil care moștenește de la Animal
class Dog(Animal):
    # Suprascrierea metodei make_sound()
    def make_sound(self):
        print("Ham ham!")

    # Exemplu de apelare a metodei părintelui
    def eat(self):
        print("Câinele mănâncă.")
        super().make_sound() # Apelăm metoda din clasa părinte

# Demonstrație
my_animal = Animal()
my_dog = Dog() # Polimorfism

my_animal.make_sound() # Va afișa: Animalul face un sunet
my_dog.make_sound()   # Va afișa: Ham ham!

specific_dog = Dog()
specific_dog.eat() # Va afișa: Câinele mănâncă. 
                      # Animalul face un sunet

Suprascrierea este utilizată pentru a adapta comportamentul clasei de bază la specificul clasei derivate, păstrând în același timp interfața generală. Este un element cheie al designului orientat pe obiecte.