要扩展或修改继承的方法、属性、索引器或事件的抽象实现或虚实现,必须使用 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();
        }

    }

override 方法提供从基类继承的成员的新实现。  由 override 声明重写的方法称为重写基方法。  重写的基方法必须与 override 方法具有相同的签名。  有关继承的信息,请参见继承

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

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

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

重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且被重写的属性必须是 virtualabstractoverride 的。

有关如何使用 override 关键字的更多信息,请参见使用 Override 和 New 关键字进行版本控制了解何时使用 Override 和 New 关键字

示例

此示例定义了一个名为 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
    */