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 :
C#
abstractclassShape
{
publicabstractintGetArea();
}
classSquare : Shape
{
privateint _side;
publicSquare(int n) => _side = n;
// GetArea method is required to avoid a compile-time error.publicoverrideintGetArea() => _side * _side;
staticvoidMain()
{
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ć virtualwartość , abstractlub 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ć newmodyfikatorów , staticlub 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ć virtualwartość , abstractlub override.
W tym przykładzie zdefiniowano klasę bazową o nazwie Employeei klasę pochodną o nazwie SalesEmployee. Klasa SalesEmployee zawiera dodatkowe pole , salesbonusi zastępuje metodę CalculatePay w celu jej uwzględnienia.
C#
classTestOverride
{
publicclassEmployee
{
publicstring Name { get; }
// Basepay is defined as protected, so that it may be// accessed only by this class and derived classes.protecteddecimal _basepay;
// Constructor to set the name and basepay values.publicEmployee(string name, decimal basepay)
{
Name = name;
_basepay = basepay;
}
// Declared virtual so it can be overridden.publicvirtualdecimalCalculatePay()
{
return _basepay;
}
}
// Derive a new class from Employee.publicclassSalesEmployee : Employee
{
// New field that will affect the base pay.privatedecimal _salesbonus;
// The constructor calls the base-class version, and// initializes the salesbonus field.publicSalesEmployee(string name, decimal basepay, decimal salesbonus)
: base(name, basepay)
{
_salesbonus = salesbonus;
}
// Override the CalculatePay method// to take bonus into account.publicoverridedecimalCalculatePay()
{
return _basepay + _salesbonus;
}
}
staticvoidMain()
{
// 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.
Źródło tej zawartości można znaleźć w witrynie GitHub, gdzie można również tworzyć i przeglądać problemy i żądania ściągnięcia. Więcej informacji znajdziesz w naszym przewodniku dla współtwórców.
Opinia o produkcie .NET
.NET to projekt typu open source. Wybierz link, aby przekazać opinię:
Dołącz do serii meetup, aby tworzyć skalowalne rozwiązania sztucznej inteligencji oparte na rzeczywistych przypadkach użycia z innymi deweloperami i ekspertami.