substituição (referência C#)

O override modificador é necessário para estender ou modificar a implementação abstrata ou virtual de um método, propriedade, indexador ou evento herdado.

No exemplo a seguir, a Square classe deve fornecer uma implementação substituída de GetArea porque GetArea é herdada da classe abstrata 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

Um override método fornece uma nova implementação do método herdado de uma classe base. O método que é substituído por uma override declaração é conhecido como o método base substituído. Um override método deve ter a mesma assinatura que o método base substituído. override métodos suportam tipos de retorno covariantes. Em particular, o tipo de retorno de um override método pode derivar do tipo de retorno do método de base correspondente.

Não é possível substituir um método não virtual ou estático. O método de base substituído deve ser virtual, abstractou override.

Uma override declaração não pode alterar a virtual acessibilidade do método. Tanto o override método quanto o virtual método devem ter o mesmo modificador de nível de acesso.

Não é possível usar os newmodificadores , staticou virtual para modificar um override método.

Uma declaração de propriedade de substituição deve especificar exatamente o mesmo modificador de acesso, tipo e nome que a propriedade herdada. As propriedades de substituição somente leitura suportam tipos de retorno covariantes. A propriedade substituída deve ser virtual, abstractou override.

Para obter mais informações sobre como usar a palavra-chave, consulte Controle de versão com a substituição e novas palavras-chave e Saber quando usar a substituição e novas palavras-chave.override Para obter informações sobre herança, consulte Herança.

Exemplo

Este exemplo define uma classe base chamada Employee, e uma classe derivada chamada SalesEmployee. A SalesEmployee classe inclui um campo extra, salesbonuse substitui o método CalculatePay para levá-lo em consideração.

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
*/

Especificação da linguagem C#

Para obter mais informações, consulte a seção Substituir métodos da especificação da linguagem C#.

Para obter mais informações sobre tipos de retorno covariantes, consulte a nota de proposta de recurso.

Consulte também