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# 语言规范
有关协变返回类型的详细信息,请参阅功能建议说明。