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 返回类型可以从相应基方法的返回类型派生。

不能替代非虚拟或静态方法。 重写的基方法必须是 virtualabstractoverride

声明 override 无法更改方法的 virtual 可访问性。 方法和方法必须具有相同的访问级别修饰符virtualoverride

不能使用newstaticvirtual修饰符修改方法override

重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称。 只读重写属性支持协变返回类型。 重写的属性必须是 virtualabstractoverride

有关如何使用 override 关键字的详细信息,请参阅 使用 Override 和 New Keywords 的版本控制 以及 了解何时使用 Override 和 New Keywords。 有关继承的信息,请参阅 “继承”。

示例:

此示例定义一 个名为的基类和一个名为 的派生类。 该 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# 语言规范Override 方法部分。

有关协变返回类型的详细信息,请参阅 功能建议说明

另请参阅