Cos'è polimorfismo?

Polimorfismo

Il polimorfismo, derivato dal greco "poli" (molti) e "morphé" (forma), è un concetto fondamentale nella programmazione orientata agli oggetti (OOP) che permette a un'entità (come un oggetto, una variabile o una funzione) di assumere diverse forme o comportamenti. In altre parole, una stessa interfaccia può essere utilizzata per classi diverse.

Tipi di Polimorfismo:

Esistono principalmente due tipi di polimorfismo:

  • Polimorfismo Statico (Compile-time Polymorphism): Questo tipo di polimorfismo viene risolto al momento della compilazione. I due meccanismi principali che lo implementano sono:

    • Overloading (Sovraccarico): Si verifica quando più metodi all'interno della stessa classe hanno lo stesso nome ma firme diverse (numero, tipo o ordine dei parametri). Il compilatore seleziona il metodo corretto da chiamare in base agli argomenti forniti. Per esempio, una classe Calcolatrice potrebbe avere metodi somma(int a, int b) e somma(double a, double b).
    • Template (Modelli): Permettono di scrivere codice generico che può operare su diversi tipi di dati senza dover scrivere codice specifico per ogni tipo.
  • Polimorfismo Dinamico (Runtime Polymorphism): Questo tipo di polimorfismo viene risolto durante l'esecuzione del programma. Il meccanismo principale che lo implementa è:

    • Overriding (Sovrascrittura): Si verifica quando una sottoclasse (classe derivata) fornisce un'implementazione specifica per un metodo che è già definito nella sua superclasse (classe base). Quando un oggetto della sottoclasse chiama quel metodo, viene eseguita l'implementazione della sottoclasse anziché quella della superclasse. Ciò è possibile grazie all'utilizzo di ereditarietà e funzioni virtuali (o metodi astratti, nel caso di classi astratte).

Vantaggi del Polimorfismo:

  • Flessibilità: Permette di trattare oggetti di classi diverse in modo uniforme, semplificando il codice e rendendolo più adattabile ai cambiamenti.
  • Estensibilità: Consente di aggiungere nuove classi senza dover modificare il codice esistente che utilizza le interfacce polimorfiche.
  • Riutilizzabilità del codice: Riduce la duplicazione del codice grazie all'uso di interfacce comuni.
  • Modularità: Favorisce la creazione di codice modulare e ben organizzato.

Esempio Concettuale:

Immaginiamo di avere una classe base Forma con un metodo calcolaArea(). Possiamo avere sottoclassi come Cerchio, Quadrato e Triangolo, ognuna con la propria implementazione del metodo calcolaArea(). Il polimorfismo ci permette di trattare tutti questi oggetti come oggetti di tipo Forma e chiamare il metodo calcolaArea() su di essi, sapendo che verrà eseguita l'implementazione specifica per ogni tipo di forma.