override (справочник по C#)
Модификатор override
требуется для расширения или изменения абстрактной или виртуальной реализации унаследованного метода, свойства, индексатора или события.
В следующем примере класс Square
должен предоставить переопределенную реализацию GetArea
, так как GetArea
является унаследованным от абстрактного класса 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
Метод override
предоставляет новую реализацию метода, унаследованного от базового класса. Метод, переопределенный объявлением override
, называется переопределенным базовым методом. Метод override
должен иметь ту же сигнатуру, что и переопределенный базовый метод. override
методы поддерживают ковариантные возвращаемые типы. В частности, тип возвращаемого значения метода override
может быть производным от типа возвращаемого значения соответствующего базового метода.
Невиртуальный или статический метод нельзя переопределить. Переопределенный базовый метод должен иметь тип virtual
, abstract
или override
.
Объявление override
не может изменить доступность метода virtual
. Методы override
и virtual
должны иметь одинаковый модификатор уровня доступа.
Модификаторы new
, static
и virtual
нельзя использовать для изменения метода override
.
Переопределяющее объявление свойства должно задавать такие же модификатор уровня доступа, тип и имя, которые имеются у унаследованного свойства. Свойства, переопределяющие только для чтения, поддерживают ковариантные возвращаемые типы. Переопределенное свойство должно быть virtual
, abstract
или override
.
Дополнительные сведения об использовании ключевого слова override
см. в разделах Управление версиями с помощью ключевых слов Override и New и Использование ключевых слов Override и New. Дополнительные сведения о наследовании см. в разделе Наследование.
Пример
В этом примере определяется базовый класс с именем Employee
и производный класс с именем SalesEmployee
. Класс SalesEmployee
включает дополнительное поле salesbonus
, для использования которого переопределяется метод CalculatePay
.
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
*/
Спецификация языка C#
Дополнительные сведения см. в разделе Методы переопределения статьи Спецификация языка C#.
Дополнительные сведения о ковариантных типах возвращаемых значений см. в примечании к функциям.