Condividi tramite


Sapere quando utilizzare le parole chiave Override e New (Guida per programmatori C#)

Aggiornamento: novembre 2007

In C# i metodi delle classi derivate possono avere lo stesso nome dei metodi delle classi base, purché vengano fornite informazioni molto specifiche sulle modalità di gestione del nuovo metodo. Nell'esempio riportato di seguito viene illustrato l'utilizzo delle parole chiave new e override.

Vengono innanzitutto dichiarate tre classi: una classe base denominata Car e due classi che derivano da essa, ConvertibleCar e Minivan. La classe base contiene un singolo metodo, DescribeCar, che invia una descrizione dell'automobile alla console. Anche i metodi delle classi derivate comprendono un metodo denominato DescribeCar, che ne visualizza le proprietà univoche. Questi metodi chiamano inoltre il metodo DescribeCar della classe base, per dimostrare che hanno ereditato le proprietà della classe Car.

Per evidenziare la differenza, la classe ConvertibleCar viene definita con la parola chiave new, mentre la classe Minivan con la parola chiave override.

// Define the base class
class Car
{
    public virtual void DescribeCar()
    {
        System.Console.WriteLine("Four wheels and an engine.");
    }
}

// Define the derived classes
class ConvertibleCar : Car
{
    public new virtual void DescribeCar()
    {
        base.DescribeCar();
        System.Console.WriteLine("A roof that opens up.");
    }
}

class Minivan : Car
{
    public override void DescribeCar()
    {
        base.DescribeCar();
        System.Console.WriteLine("Carries seven people.");
    }
}

A questo punto è possibile scrivere del codice che dichiara le istanze di queste classi e chiama i relativi metodi in modo che gli oggetti possano descrivere se stessi:

public static void TestCars1()
{
    Car car1 = new Car();
    car1.DescribeCar();
    System.Console.WriteLine("----------");

    ConvertibleCar car2 = new ConvertibleCar();
    car2.DescribeCar();
    System.Console.WriteLine("----------");

    Minivan car3 = new Minivan();
    car3.DescribeCar();
    System.Console.WriteLine("----------");
}

Come è possibile prevedere, l'output è simile al seguente:

Four wheels and an engine.

----------

Four wheels and an engine.

A roof that opens up.

----------

Four wheels and an engine.

Carries seven people.

----------

Nella sezione successiva di codice viene tuttavia dichiarata una matrice di oggetti derivati dalla classe base Car. Questa matrice può archiviare gli oggetti Car, ConvertibleCar e Minivan e viene dichiarata nel modo seguente:

public static void TestCars2()
{
    Car[] cars = new Car[3];
    cars[0] = new Car();
    cars[1] = new ConvertibleCar();
    cars[2] = new Minivan();
}

È quindi possibile utilizzare un ciclo foreach per esaminare ciascun oggetto Car contenuto nella matrice e chiamare il metodo DescribeCar, come illustrato di seguito:

foreach (Car vehicle in cars)
{
    System.Console.WriteLine("Car object: " + vehicle.GetType());
    vehicle.DescribeCar();
    System.Console.WriteLine("----------");
}

L'output di questo ciclo è il seguente:

Car object: YourApplication.Car

Four wheels and an engine.

----------

Car object: YourApplication.ConvertibleCar

Four wheels and an engine.

----------

Car object: YourApplication.Minivan

Four wheels and an engine.

Carries seven people.

----------

Si noti che la descrizione ConvertibleCar è diversa dal previsto. Poiché per definire questo metodo è stata utilizzata la parola chiave new, invece del metodo della classe derivata viene chiamato quello della classe base. L'oggetto Minivan chiama correttamente il metodo sottoposto a override, generando i risultati previsti.

Se si desidera applicare una regola secondo la quale tutte le classi derivate da Car devono implementare il metodo DescribeCar, è necessario creare una nuova classe base che definisca il metodo DescribeCar come abstract. Un metodo astratto non contiene codice, ma solo la firma del metodo. Le eventuali classi derivate da questa classe base devono fornire un'implementazione di DescribeCar. Per ulteriori informazioni, vedere abstract.

Vedere anche

Concetti

Guida per programmatori C#

Riferimenti

Classi e strutture (Guida per programmatori C#)

Controllo delle versioni con le parole chiave Override e New (Guida per programmatori C#)