0Pricing
C# Academy · Lezione

Polimorfismo e dispatch dinamico

Comprenda il polimorfismo: chiami membri virtual tramite un riferimento alla classe base, utilizzi raccolte tipizzate con la classe base, eviti il method hiding ed esegua cast sicuri quando necessario.

Polimorfismo e dispatch dinamico è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 3 di 3. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C# Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C# Academy include 3 lezioni in totale.

Panoramica sul polimorfismo

Obiettivo: Usare un unico tipo base e permettere ai tipi derivati di personalizzare il comportamento.

  • Riferimento alla classe base, oggetto derivato
  • virtual + override → dispatch dinamico
  • Raccolte tipizzate con il tipo base
  • Eviti di nascondere i metodi con new

Basi del dispatch dinamico

La chiamata a un metodo virtual usa il tipo runtime dell'oggetto, non il tipo della variabile noto in fase di compilazione.

using System;

public class Animal
{
  public virtual string Speak() { return "???"; }
}

public class Cat : Animal
{
  public override string Speak() { return "Meow"; }
}

public class Dog : Animal
{
  public override string Speak() { return "Woof"; }
}

public class Program
{
  public static void Main(string[] args)
  {
    Animal a1 = new Cat(); // base reference
    Animal a2 = new Dog();
    Console.WriteLine(a1.Speak()); // Meow
    Console.WriteLine(a2.Speak()); // Woof
  }
}

Polimorfismo nelle raccolte

Conservi tipi derivati diversi in una List<Base> e chiami i membri virtual in modo uniforme.

using System;
using System.Collections.Generic;

public class Shape
{
  public virtual double Area() { return 0.0; }
}

public class Rectangle : Shape
{
  private readonly int _w, _h;
  public Rectangle(int w, int h) { _w = w; _h = h; }
  public override double Area() { return _w * _h; }
}

public class Circle : Shape
{
  private readonly int _r;
  public Circle(int r) { _r = r; }
  public override double Area() { return 3.14159 * _r * _r; }
}

public class Program
{
  public static void Main(string[] args)
  {
    List<Shape> shapes = new List<Shape>();
    shapes.Add(new Rectangle(3, 4));
    shapes.Add(new Circle(2));

    foreach (Shape s in shapes)
    {
      Console.WriteLine("Area = " + s.Area()); // calls correct override
    }
  }
}

Nascondimento e override a confronto

Eviti il nascondimento dei metodi (new). Usi override per il vero polimorfismo; il nascondimento chiama la versione della classe base tramite un riferimento alla classe base.

using System;

public class Printer
{
  public virtual void Print() { Console.WriteLine("[Base]"); }
}

public class LoudPrinter : Printer
{
  public override void Print() { Console.WriteLine("[LOUD]"); }
}

public class HiddenPrinter : Printer
{
  // Hides the base method instead of overriding (BAD fit for polymorphism)
  public new void Print() { Console.WriteLine("[HIDDEN]"); }
}

public class Program
{
  public static void Main(string[] args)
  {
    Printer a = new LoudPrinter();
    Printer b = new HiddenPrinter();

    a.Print(); // [LOUD]  (override works)
    b.Print(); // [Base]  (hiding fails via base reference)
  }
}

Casting sicuro (as + controllo)

Preferisca le chiamate alla classe base o virtual. Se deve usare membri esclusivi della classe derivata, esegua un cast sicuro (as + controllo null).

using System;

public class Vehicle
{
  public virtual string Info() { return "Vehicle"; }
}

public class Car : Vehicle
{
  public bool HasAirConditioning;
  public override string Info() { return "Car"; }
}

public class Program
{
  public static void Main(string[] args)
  {
    Vehicle v = new Car();
    Console.WriteLine(v.Info()); // polymorphic call

    // Need a Car-only member? Cast carefully using 'as'
    Car c = v as Car;
    if (c != null)
    {
      c.HasAirConditioning = true;
      Console.WriteLine("AC set: " + c.HasAirConditioning);
    }
    else
    {
      Console.WriteLine("Not a Car");
    }
  }
}

Suggerimenti sul polimorfismo

Suggerimenti:

  • Progetti prima di tutto per le chiamate alla classe base o virtual.
  • Usi override, non new, per modificare il comportamento.
  • Mantenga le API della classe base piccole e stabili.
  • Esegua cast raramente; preferisca il polimorfismo o le interfacce.

Significato del dispatch dinamico

Verifica rapida: che cosa significa dispatch dinamico in C#?

Riepilogo

Riepilogo: Il polimorfismo consente a una chiamata alla classe base di raggiungere molti comportamenti derivati tramite virtual/override. Usi raccolte tipizzate con il tipo base, eviti il nascondimento con new ed esegua cast solo quando necessario.

Domande Frequenti

La lezione «Polimorfismo e dispatch dinamico» è gratuita?

Sì — il testo completo di «Polimorfismo e dispatch dinamico» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C# Academy, passa a CoddyKit PRO. Il corso C# Academy include 3 lezioni in totale.

Cosa imparerò in «Polimorfismo e dispatch dinamico»?

Comprenda il polimorfismo: chiami membri virtual tramite un riferimento alla classe base, utilizzi raccolte tipizzate con la classe base, eviti il method hiding ed esegua cast sicuri quando necessari… Eserciti C# Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C# Academy?

Non è richiesta alcuna esperienza precedente. C# Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 3.

Quanto tempo richiede la lezione «Polimorfismo e dispatch dinamico»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C# Academy?

Sì. Ogni lezione C# Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. virtual/override/sealed e classi astratte
  2. Interfacce (introduzione) e implementazione di più interfacce
  3. Polimorfismo e dispatch dinamico
← Torna a C# Academy