override (riferimento per C#)

Il modificatore override è necessario per estendere o modificare l'implementazione astratta o virtuale di un metodo, una proprietà, un indicizzatore o un evento ereditato.

In questo esempio la classe Square deve specificare un'implementazione sottoposta a override di GetArea poiché GetArea viene ereditato dalla classe astratta Shape:

abstract class Shape
{
    public abstract int GetArea();
}

class Square : Shape
{
    private int _side;

    public Square(int n) => _side = n;

    // GetArea method is required to avoid a compile-time error.
    public override int GetArea() => _side * _side;

    static void Main()
    {
        var sq = new Square(12);
        Console.WriteLine($"Area of the square = {sq.GetArea()}");
    }
}
// Output: Area of the square = 144

Un metodo override offre una nuova implementazione di un metodo ereditato da una classe base. Il metodo che viene sottoposto a override mediante una dichiarazione override viene definito metodo di base sottoposto a override. Un metodo override deve avere la stessa firma del metodo di base sottoposto a override. I metodi override supportano i tipi restituiti covarianti. In particolare, il tipo restituito di un metodo override può derivare dal tipo restituito del metodo di base corrispondente.

Non è possibile eseguire l'override di un metodo non virtuale o statico. Il metodo di base sottoposto a override deve essere virtual, abstract o override.

Una dichiarazione override non può modificare l'accessibilità del metodo virtual. Il metodo override e il metodo virtual devono avere lo stesso modificatore del livello di accesso.

Non è possibile usare i modificatori new, static o virtual per modificare un metodo override.

Una dichiarazione di proprietà di override deve indicare esattamente lo stesso modificatore di accesso, lo stesso tipo e lo stesso nome della proprietà ereditata. Le proprietà di override di sola lettura supportano i tipi restituiti covarianti. La proprietà sottoposta a override deve essere virtual, abstract o override.

Per altre informazioni sull'uso della parola chiave override, vedere Controllo delle versioni con le parole chiave Override e New e Sapere quando utilizzare le parole chiave Override e New. Per informazioni sull'ereditarietà, vedere Ereditarietà.

Esempio

Questo esempio definisce una classe base denominata Employee e una classe derivata denominata SalesEmployee. La classe SalesEmployee include il campo aggiuntivo salesbonus ed esegue l'override del metodo CalculatePay per prenderlo in considerazione.

class TestOverride
{
    public class Employee
    {
        public string Name { get; }

        // Basepay is defined as protected, so that it may be
        // accessed only by this class and derived classes.
        protected decimal _basepay;

        // Constructor to set the name and basepay values.
        public Employee(string name, decimal basepay)
        {
            Name = name;
            _basepay = basepay;
        }

        // Declared virtual so it can be overridden.
        public virtual decimal CalculatePay()
        {
            return _basepay;
        }
    }

    // Derive a new class from Employee.
    public class SalesEmployee : Employee
    {
        // New field that will affect the base pay.
        private decimal _salesbonus;

        // The constructor calls the base-class version, and
        // initializes the salesbonus field.
        public SalesEmployee(string name, decimal basepay, decimal salesbonus)
            : base(name, basepay)
        {
            _salesbonus = salesbonus;
        }

        // Override the CalculatePay method
        // to take bonus into account.
        public override decimal CalculatePay()
        {
            return _basepay + _salesbonus;
        }
    }

    static void Main()
    {
        // Create some new employees.
        var employee1 = new SalesEmployee("Alice", 1000, 500);
        var employee2 = new Employee("Bob", 1200);

        Console.WriteLine($"Employee1 {employee1.Name} earned: {employee1.CalculatePay()}");
        Console.WriteLine($"Employee2 {employee2.Name} earned: {employee2.CalculatePay()}");
    }
}
/*
    Output:
    Employee1 Alice earned: 1500
    Employee2 Bob earned: 1200
*/

Specifiche del linguaggio C#

Per altre informazioni, vedere la sezione Metodi di override della Specifica del linguaggio C#.

Per altre informazioni sui tipi restituiti covarianti, vedere la nota sulla proposta di funzionalità.

Vedi anche