ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# override(C# 参考) 要扩展或修改继承的方法、属性、索引器或事件的抽象实现或虚实现,必须使用 **override** 修饰符。 在此示例中,Square 类必须提供 Area 的重写实现,因为 Area 继承自抽象的 ShapesClass: ``` abstract class ShapesClass { abstract public int Area(); } class Square : ShapesClass { int side = 0; public Square(int n) { side = n; } // Area method is required to avoid // a compile-time error. public override int Area() { return side * side; } static void Main() { Square sq = new Square(12); Console.WriteLine("Area of the square = {0}", sq.Area()); } interface I { void M(); } abstract class C : I { public abstract void M(); } } // Output: Area of the square = 144 ``` **override** 方法提供从基类继承的成员的新实现。由 **override** 声明重写的方法称为重写基方法。重写的基方法必须与 **override** 方法具有相同的签名。有关继承的信息,请参见[继承(C# 编程指南)](https://msdn.microsoft.com/zh-cn/library/ms173149.aspx)。 不能重写非虚方法或静态方法。重写的基方法必须是 **virtual**、**abstract** 或 **override** 的。 **override** 声明不能更改 **virtual** 方法的可访问性。 **override** 方法和 **virtual** 方法必须具有相同的[访问级别修饰符](https://msdn.microsoft.com/zh-cn/library/wxh6fsc7.aspx)。 您不能使用 **new**、**static** 或 **virtual** 修饰符来修改 **override** 方法。 重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且被重写的属性必须是 **virtual**、**abstract** 或 **override** 的。 有关如何使用 **override** 关键字的更多信息,请参见[使用 Override 和 New 关键字进行版本控制(C# 编程指南)](https://msdn.microsoft.com/zh-cn/library/6fawty39.aspx)和[了解何时使用 Override 和 New 关键字](https://msdn.microsoft.com/zh-cn/library/ms173153.aspx)。 此示例定义了一个名为 Employee 的基类和一个名为 SalesEmployee 的派生类。 SalesEmployee 类包括一个额外的属性 salesbonus,并重写方法 CalculatePay 以便将该属性考虑在内。 ``` class TestOverride { public class Employee { public string name; // Basepay is defined as protected, so that it may be // accessed only by this class and derrived classes. protected decimal basepay; // Constructor to set the name and basepay values. public Employee(string name, decimal basepay) { this.name = name; this.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) { this.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. SalesEmployee employee1 = new SalesEmployee("Alice", 1000, 500); Employee employee2 = new Employee("Bob", 1200); Console.WriteLine("Employee4 " + employee1.name + " earned: " + employee1.CalculatePay()); Console.WriteLine("Employee4 " + employee2.name + " earned: " + employee2.CalculatePay()); } } /* Output: Employee4 Alice earned: 1500 Employee4 Bob earned: 1200 */ ``` ## C# 语言规范 有关详细信息,请参阅 [C# 语言规范](https://msdn.microsoft.com/zh-cn/library/ms228593.aspx)。该语言规范是 C# 语法和用法的权威资料。 ## 请参阅 [C# 参考](https://msdn.microsoft.com/zh-cn/library/618ayhy6.aspx) [C# 编程指南](https://msdn.microsoft.com/zh-cn/library/67ef8sbd.aspx) [继承(C# 编程指南)](https://msdn.microsoft.com/zh-cn/library/ms173149.aspx) [C# 关键字](https://msdn.microsoft.com/zh-cn/library/x53a06bb.aspx) [修饰符(C# 参考)](https://msdn.microsoft.com/zh-cn/library/6tcf2h8w.aspx) [abstract(C# 参考)](https://msdn.microsoft.com/zh-cn/library/sf985hc5.aspx) [virtual(C# 参考)](https://msdn.microsoft.com/zh-cn/library/9fkccyh4.aspx) [new(C# 参考)](https://msdn.microsoft.com/zh-cn/library/51y09td4.aspx) [多态性(C# 编程指南)](https://msdn.microsoft.com/zh-cn/library/ms173152.aspx)