Sobes.tech
Junior

Cos'è il polimorfismo nella programmazione?

sobes.tech AI

Risposta dell'AI

Il polimorfismo è la capacità di oggetti di classi diverse di rispondere in modo diverso alla stessa chiamata di metodo. Si ottiene attraverso l'uso di ereditarietà, classi astratte e interfacce. In C#, il polimorfismo si manifesta attraverso la sovrascrittura (overriding) dei metodi della classe base nelle classi derivate e tramite l'overloading dei metodi.

Esempi di polimorfismo:

  1. Sovrascrittura dei metodi (Polimorfismo in runtime): La classe derivata fornisce la propria implementazione di un metodo dichiarato nella classe base. Per fare ciò, nella classe base si usa la parola chiave virtual, e nella derivata override.

    // Classe base
    class Shape
    {
        // Metodo virtuale che può essere sovrascritto
        public virtual void Draw()
        {
            // Implementazione di default
        }
    }
    
    // Classe derivata 1
    class Circle : Shape
    {
        // Sovrascrittura del metodo Draw
        public override void Draw()
        {
            // Implementazione per il cerchio
        }
    }
    
    // Classe derivata 2
    class Square : Shape
    {
        // Sovrascrittura del metodo Draw
        public override void Draw()
        {
            // Implementazione per il quadrato
        }
    }
    

    In questo caso, si può creare una lista di oggetti Shape e chiamare il metodo Draw per ciascuno, e verrà chiamata l'implementazione specifica per ogni tipo di figura.

  2. Overloading dei metodi (Polimorfismo in compile-time): Diversi metodi con lo stesso nome, ma con firme diverse (numero o tipi di parametri) nella stessa classe.

    class Calculator
    {
        // Metodo sovraccaricato Add (per int)
        public int Add(int x, int y)
        {
            return x + y;
        }
    
        // Metodo sovraccaricato Add (per double)
        public double Add(double x, double y)
        {
            return x + y;
        }
    }
    

Il polimorfismo favorisce la creazione di codice più flessibile, estensibile e di facile manutenzione. Permette di scrivere codice generico che può lavorare con oggetti di diversi tipi.