Share via


override (C# 參考)

override 修飾詞需要用來擴充或修改繼承的方法、屬性、索引子或事件的抽象或虛擬實作。

範例

在這個範例中,Square 類別 (Class) 必須提供 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 方法提供繼承自基底類別 (Base Class) 的新成員實作。 由 override 宣告覆寫的方法,就是被覆寫的基底方法。 被覆寫的基底方法必須和 override 方法有相同的簽章。 如需繼承 (Inheritance) 的詳細資訊,請參閱繼承 (C# 程式設計手冊)

您不能覆寫非虛擬或靜態方法。 被覆寫的基底方法必須是 virtual、abstract 或 override。

override 宣告不能變更 virtual 方法的存取範圍。 override 方法和 virtual 方法都必須有相同的存取層級修飾詞

您不能使用 new、static 或 virtual 修飾詞來修改 override 方法。

覆寫屬性宣告必須指定和所繼承屬性完全相同的存取修飾詞、型別和名稱,且被覆寫的屬性必須是 virtual、abstract 或 override。

如需如何使用 override 關鍵字的詳細資訊,請參閱使用 Override 和 New 關鍵字進行版本控制 (C# 程式設計手冊)了解使用 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
*/

C# 語言規格

如需詳細資訊,請參閱 C# 語言規格。語言規格是 C# 語法和用法的限定來源。

請參閱

參考

繼承 (C# 程式設計手冊)

C# 關鍵字

修飾詞 (C# 參考)

abstract (C# 參考)

virtual (C# 參考)

new (C# 參考)

多型 (C# 程式設計手冊)

概念

C# 程式設計手冊

其他資源

C# 參考