override (C# 參考)override (C# Reference)

需要 override 修飾詞才能夠擴充或修改繼承方法、屬性、索引子或事件的抽象或虛擬實作。The override modifier is required to extend or modify the abstract or virtual implementation of an inherited method, property, indexer, or event.

範例Example

在此範例中,Square 類別必須提供 GetArea 的覆寫實作為,因為 GetArea 繼承自抽象的 Shape 類別:In this example, the Square class must provide an overridden implementation of GetArea because GetArea is inherited from the abstract Shape class:

abstract class Shape
{
    public abstract int GetArea();
}

class Square : Shape
{
    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 方法提供繼承自基底類別的成員新實作。An override method provides a new implementation of a member that is inherited from a base class. override 宣告覆寫的方法稱之為覆寫基底方法。The method that is overridden by an override declaration is known as the overridden base method. 覆寫基底方法必須和 override 方法有相同的簽章。The overridden base method must have the same signature as the override method. 如需繼承的資訊,請參閱繼承For information about inheritance, see Inheritance.

您無法覆寫非虛擬或靜態方法。You cannot override a non-virtual or static method. 覆寫基底方法必須是 virtualabstractoverrideThe overridden base method must be virtual, abstract, or override.

override 宣告不能變更 virtual 方法的存取範圍。An override declaration cannot change the accessibility of the virtual method. override 方法和 virtual 方法都必須具有相同的存取層級修飾詞Both the override method and the virtual method must have the same access level modifier.

您不能使用 newstaticvirtual 修飾詞來修改 override 方法。You cannot use the new, static, or virtual modifiers to modify an override method.

要覆寫的屬性宣告必須指定和繼承屬性完全相同的存取修飾詞、型別和名稱,而覆寫的屬性必須是 virtualabstractoverrideAn overriding property declaration must specify exactly the same access modifier, type, and name as the inherited property, and the overridden property must be virtual, abstract, or override.

如需如何使用 override 關鍵字的詳細資訊,請參閱使用 Override 和 New 關鍵字進行版本控制了解使用 Override 和 New 關鍵字的時機For more information about how to use the override keyword, see Versioning with the Override and New Keywords and Knowing when to use Override and New Keywords.

範例Example

本例會定義名為 Employee 的基底類別,以及名為 SalesEmployee 的衍生類別。This example defines a base class named Employee, and a derived class named SalesEmployee. SalesEmployee 類別包含額外的欄位 salesbonus,並會覆寫方法 CalculatePay 以將其納入考量。The SalesEmployee class includes an extra field, salesbonus, and overrides the method CalculatePay in order to take it into account.

class TestOverride
{
    public class Employee
    {
        public string name;

        // 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)
        {
            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.
        var employee1 = new SalesEmployee("Alice", 
                      1000, 500);
        var 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# language specification

如需詳細資訊,請參閱<C# 語言規格>。For more information, see the C# Language Specification. 語言規格是 C# 語法及用法的限定來源。The language specification is the definitive source for C# syntax and usage.

請參閱See also