Dela via


åsidosättning (C#-referens)

Modifieraren override krävs för att utöka eller ändra den abstrakta eller virtuella implementeringen av en ärvd metod, egenskap, indexerare eller händelse.

I följande exempel Square måste klassen tillhandahålla en åsidosättad implementering av GetArea eftersom GetArea ärvs från den abstrakta Shape klassen:

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

En override metod ger en ny implementering av metoden som ärvts från en basklass. Den metod som åsidosätts av en override deklaration kallas den åsidosatta basmetoden. En override metod måste ha samma signatur som den åsidosatta basmetoden. override metoder stöder kovarianska returtyper. I synnerhet kan returtypen för en override metod härledas från returtypen för motsvarande basmetod.

Du kan inte åsidosätta en icke-virtuell eller statisk metod. Den åsidosatta basmetoden måste vara virtual, abstracteller override.

En override deklaration kan inte ändra metodens virtual tillgänglighet. override Både metoden och virtual metoden måste ha samma åtkomstnivåmodifierare.

Du kan inte använda newmodifierarna , staticeller virtual för att ändra en override metod.

En åsidosättande egenskapsdeklaration måste ange exakt samma åtkomstmodifierare, typ och namn som den ärvda egenskapen. Skrivskyddade åsidosättande egenskaper stöder samtidiga returtyper. Den åsidosatta egenskapen måste vara virtual, abstracteller override.

Mer information om hur du använder nyckelordet overridefinns i Versionshantering med åsidosättning och nya nyckelord och Veta när du ska använda åsidosättning och nya nyckelord. Information om arv finns i Arv.

Exempel

I det här exemplet definieras en basklass med namnet Employee, och en härledd klass med namnet SalesEmployee. Klassen SalesEmployee innehåller ett extra fält, salesbonus, och åsidosätter metoden CalculatePay för att ta hänsyn till den.

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

Språkspecifikation för C#

Mer information finns i avsnittet Åsidosättningsmetoder i C#-språkspecifikationen.

Mer information om covarianta returtyper finns i kommentaren om funktionsförslaget.

Se även