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 方法支援 Covariant 傳回類型。 特別的是,override 方法的傳回類型可以衍生自對應基底方法的傳回類型。

您無法覆寫非虛擬或靜態方法。 覆寫基底方法必須是 virtualabstractoverride

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

您不能使用 newstaticvirtual 修飾詞來修改 override 方法。

要覆寫的屬性宣告必須指定與繼承屬性完全相同的存取修飾詞、類型和名稱。 唯讀覆寫屬性支援 Covariant 傳回類型。 覆寫屬性必須是 virtual, abstractoverride

如需如何使用 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# 語言規格

如需詳細資訊,請參閱 C# 語言規格覆寫方法一節。

如需 Covariant 傳回類型的詳細資訊,請參閱功能提案附註

另請參閱