override (odwołanie w C#)
Modyfikator override
jest wymagany do rozszerzenia lub zmodyfikowania abstrakcyjnej lub wirtualnej implementacji dziedziczonej metody, właściwości, indeksatora lub zdarzenia.
W poniższym przykładzie Square
klasa musi podać zastąpioną implementację, GetArea
ponieważ GetArea
jest dziedziczona z klasy abstrakcyjnej 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
Metoda override
zapewnia nową implementację metody dziedziczonej z klasy bazowej. Metoda, która jest zastępowana przez deklarację override
, jest znana jako zastąpiona metoda podstawowa. override
Metoda musi mieć ten sam podpis co zastąpiona metoda podstawowa. override
metody obsługują kowariantne typy zwracane. W szczególności zwracany typ override
metody może pochodzić z zwracanego typu odpowiedniej metody bazowej.
Nie można zastąpić metody innej niż wirtualna ani statyczna. Zastępowana metoda podstawowa musi mieć virtual
wartość , abstract
lub override
.
Deklaracja override
nie może zmienić dostępności virtual
metody. Zarówno metoda, jak override
i virtual
metoda muszą mieć ten sam modyfikator poziomu dostępu.
Nie można użyć new
modyfikatorów , static
lub virtual
, aby zmodyfikować metodę override
.
Zastępowanie deklaracji właściwości musi określać dokładnie ten sam modyfikator dostępu, typ i nazwę co dziedziczona właściwość. Właściwości zastępowania tylko do odczytu obsługują kowariantne typy zwracane. Właściwość zastąpienia musi mieć virtual
wartość , abstract
lub override
.
Aby uzyskać więcej informacji na temat używania słowa kluczowego override
, zobacz Przechowywanie wersji za pomocą przesłonięć i nowych słów kluczowych oraz Znajomość, kiedy należy użyć przesłonięć i nowych słów kluczowych. Aby uzyskać informacje o dziedziczeniu, zobacz Dziedziczenie.
Przykład
W tym przykładzie zdefiniowano klasę bazową o nazwie Employee
i klasę pochodną o nazwie SalesEmployee
. Klasa SalesEmployee
zawiera dodatkowe pole , salesbonus
i zastępuje metodę CalculatePay
w celu jej uwzględnienia.
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
*/
specyfikacja języka C#
Aby uzyskać więcej informacji, zobacz sekcję Zastępowanie metod specyfikacji języka C#.
Aby uzyskać więcej informacji na temat kowariantnych typów zwracanych, zobacz notatkę dotyczącą propozycji funkcji.