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.