Quando avviene la sovrascrittura di un metodo (Overriding)?
sobes.tech AI
Risposta dell'AI
La sovrascrittura di metodo nella programmazione orientata agli oggetti avviene quando una sottoclasse ha un metodo con lo stesso nome, firma (lista di parametri) e tipo di ritorno di un metodo nella sua classe padre. Questo permette alla sottoclasse di fornire la propria implementazione del metodo ereditato.
Condizioni principali per la sovrascrittura:
- Ereditarietà: La sottoclasse deve ereditare dalla classe padre.
- Firma del metodo: Il metodo che viene sovrascritto nella sottoclasse deve avere la stessa firma (nome del metodo e lista dei tipi di parametri, loro ordine e quantità) del metodo nella classe padre. In alcuni linguaggi (ad esempio Java) è anche richiesto che il tipo di ritorno corrisponda o sia covariante.
- Modificatori di accesso: Il modificatore di accesso del metodo sovrascritto nella sottoclasse non può essere più restrittivo di quello del metodo nella classe padre.
- Non si può sovrascrivere: Metodi statici (
static), finali (finalin Java,sealedin C#) e privati (private) non partecipano al polimorfismo tramite ereditarietà.
Esempio in Java:
// Classe padre
class Animal {
public void sound() {
// Implementazione di default
System.out.println("L'animale fa un suono");
}
}
// Sottoclasse che sovrascrive il metodo sound()
class Dog extends Animal {
@Override // Annotazione per verifica del compilatore
public void sound() {
// Implementazione specifica per Dog
System.out.println("Il cane abbaia");
}
}
class Main {
public static void main(String[] args) {
Animal mioAnimale = new Animal();
Animal mioCaneComeAnimale = new Dog(); // Polimorfismo
Dog mioCane = new Dog();
mioAnimale.sound(); // Chiama sound() di Animal
mioCaneComeAnimale.sound(); // Chiama il sound() sovrascritto di Dog (grazie al polimorfismo)
mioCane.sound(); // Chiama il sound() sovrascritto di Dog
}
}
Esempio in Python:
# Classe padre
class Animal:
def sound(self):
# Implementazione di default
print("L'animale fa un suono")
# Sottoclasse che sovrascrive il metodo sound()
class Dog(Animal):
def sound(self):
# Implementazione specifica per Dog
print("Il cane abbaia")
# Uso
mio_animale = Animal()
mio_caneComeAnimale = Dog() # Polimorfismo
mio_cane = Dog()
mio_animale.sound() # Chiama sound() di Animal
mio_caneComeAnimale.sound() # Chiama il sound() sovrascritto di Dog (grazie al polimorfismo)
mio_cane.sound() # Chiama il sound() sovrascritto di Dog
La sovrascrittura viene utilizzata per ottenere il polimorfismo in fase di esecuzione, consentendo di eseguire azioni diverse a seconda del tipo effettivo dell'oggetto, nonostante si utilizzi un riferimento alla classe padre. Questo è un principio chiave della programmazione orientata agli oggetti per costruire sistemi flessibili ed estensibili.