Поделиться через


override (Справочник по C#)

Модификатор override требуется для расширения или изменения абстрактной или виртуальной реализации унаследованного метода, свойства, индексатора или события.

Пример

В этом примере класс Square должен предоставить переопределенную реализацию Area, поскольку Area является унаследованным от абстрактного класса ShapesClass.


abstract class ShapesClass
{
    abstract public int Area();
}
class Square : ShapesClass
{
    int side = 0;

    public Square(int n)
    {
        side = n;
    }
    // Area method is required to avoid
    // a compile-time error.
    public override int Area()
    {
        return side * side;
    }

    static void Main() 
    {
        Square sq = new Square(12);
        Console.WriteLine("Area of the square = {0}", sq.Area());
    }

    interface I
    {
        void M();
    }
    abstract class C : I
    {
        public abstract void M();
    }

}
// Output: Area of the square = 144

Метод override предоставляет новую реализацию члена, унаследованного от базового класса. Метод, переопределенный объявлением override, называется переопределенным базовым методом. Переопределенный базовый метод должен иметь ту же сигнатуру, что и метод override. Дополнительные сведения о наследовании см. в разделе Наследование (Руководство по программированию на C#).

Невиртуальный или статический метод нельзя переопределить. Переопределенный базовый метод должен иметь тип virtual, abstract или override.

Объявление override не может изменить доступность метода virtual. Методы override и virtual должны иметь одинаковый модификатор уровня доступа.

Модификаторы new, static и virtual нельзя использовать для изменения метода override.

Переопределяющее объявление свойства должна задавать такие же модификатор уровня доступа, тип и имя, которые имеются у унаследованного свойства, а переопределенное свойство должно иметь тип virtual, abstract или override.

Дополнительные сведения об использовании ключевого слова override см. в разделах Практическое руководство. Управление версиями с помощью ключевых слов "Override" и "New" (Руководство по программированию в C#) и Аспекты использованию ключевых слов "Override" и "New".

В этом примере определяется базовый класс с именем Employee и производный класс с именем SalesEmployee. Класс SalesEmployee включает дополнительное свойство salesbonus, для использования которого переопределяется метод CalculatePay.

class TestOverride
{
    public class Employee
    {
        public string name;

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

        // Constructor to set the name and basepay values.
        public Employee(string name, decimal basepay)
        {
            this.name = name;
            this.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)
        {
            this.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.
        SalesEmployee employee1 = new SalesEmployee("Alice", 
                      1000, 500);
        Employee employee2 = new Employee("Bob", 1200);

        Console.WriteLine("Employee4 " + employee1.name + 
                  " earned: " + employee1.CalculatePay());
        Console.WriteLine("Employee4 " + employee2.name + 
                  " earned: " + employee2.CalculatePay());
    }
}
/*
    Output:
    Employee4 Alice earned: 1500
    Employee4 Bob earned: 1200
*/

Спецификация языка C#

Дополнительные сведения см в Спецификация языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.

См. также

Ссылки

Наследование (Руководство по программированию на C#)

Ключевые слова C#

Модификаторы (Справочник по C#)

abstract (Справочник по C#)

virtual (Справочник по C#)

new (справочник по C#)

Полиморфизм (Руководство по программированию на C#)

Основные понятия

Руководство по программированию на C#

Другие ресурсы

Справочник по C#