Informatica

Polimorfismo: classificazione di Cardelli e Wegner

La classificazione di Cardelli e Wegner distingue principalmente tra tre tipi di polimorfismo: parametrico, inclusivo e di sottotipo. Cerchiamo di spiegarli in modo semplice:

  1. Polimorfismo Parametrico:

    • Cosa fa: Consente di scrivere codice che può lavorare su diversi tipi di dati senza specificarli esplicitamente.
    • Esempio semplice: Una funzione che ordina una lista senza sapere il tipo degli elementi nella lista.
    • Analogia: Immagina una scatola nera che può ordinare qualsiasi tipo di oggetto senza conoscere i dettagli specifici di ciascun oggetto.
  2. Polimorfismo Inclusivo:

    • Cosa fa: Consente a un oggetto di appartenere a più di un tipo o di implementare più di un’interfaccia.
    • Esempio semplice: Un oggetto “Pinguino” che può appartenere sia alla classe “Uccello” che alla classe “Animale Marino”.
    • Analogia: Pensiamo a un oggetto come a una persona che può essere sia uno studente che un musicista contemporaneamente.
  3. Polimorfismo di Sottotipo:

    • Cosa fa: Consente a un oggetto di essere trattato come un’istanza di un tipo più generale.
    • Esempio semplice: Una classe “Cane” che è anche un tipo di “Animale”. Puoi trattare un cane come un animale senza sapere specificamente che è un cane.
    • Analogia: Tutti i cani sono animali, quindi puoi trattare un cane come un animale senza preoccuparti dei dettagli specifici del tipo di cane.

Ecco degli esempi concreti di codice in Java per illustrare ciascun tipo di polimorfismo.

Polimorfismo Parametrico:

// Polimorfismo Parametrico con un metodo generico per ordinare una lista di elementi
public class Ordinatore {
    public static <T extends Comparable<T>> void ordinaLista(List<T> lista) {
        Collections.sort(lista);
    }
}

// Uso dell'ordinatore con diverse liste di tipi diversi
List<Integer> listaNumeri = Arrays.asList(3, 1, 2);
Ordinatore.ordinaLista(listaNumeri);

List<String> listaStringhe = Arrays.asList("c", "a", "b");
Ordinatore.ordinaLista(listaStringhe);
  1. Polimorfismo Inclusivo:
// Polimorfismo Inclusivo con una classe che può appartenere a più di un tipo
interface Volante {
    void vola();
}

interface Nuotatore {
    void nuota();
}

class Pinguino implements Volante, Nuotatore {
    @Override
    public void vola() {
        System.out.println("Il pinguino non può volare molto lontano.");
    }

    @Override
    public void nuota() {
        System.out.println("Il pinguino è un bravo nuotatore.");
    }
}
  1. Polimorfismo di Sottotipo:
// Polimorfismo di Sottotipo con una classe che può essere trattata come un tipo più generale
class Animale {
    void emettiSuono() {
        System.out.println("Generico suono di un animale.");
    }
}

class Cane extends Animale {
    @Override
    void emettiSuono() {
        System.out.println("Bau bau!");
    }

    void scodinzola() {
        System.out.println("Il cane scodinzola felice.");
    }
}

// Uso del polimorfismo di sottotipo
Animale animale = new Cane(); // Un oggetto di tipo Cane viene trattato come un Animale
animale.emettiSuono(); // Stampa "Bau bau!"
/ 5
Grazie per aver votato!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *