override (C# 參考)

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

C# 語言參考資料記錄了 C# 語言最新版本。 同時也包含即將推出語言版本公開預覽功能的初步文件。

文件中標示了語言最近三個版本或目前公開預覽版中首次引入的任何功能。

小提示

欲查詢某功能何時首次在 C# 中引入,請參閱 C# 語言版本歷史的條目。

在下列範例中,類別 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 傳回型別可以衍生自對應基底方法的傳回型別。

你無法覆蓋非虛擬或靜態的方法。 覆寫的基底方法必須是 virtual、 abstract或 override。

宣 override 告無法改變方法的 virtual 可及性。 override方法和方法virtual都必須具有相同的存取層級修飾詞。

你不能用 new、 static或 virtual 修飾符來修改 override 方法。

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

如需如何使用 override 關鍵詞的詳細資訊,請參閱 使用 Override 和 New Keywords 的版本設定 和 知道何時使用 Override 和 New Keywords。 如需繼承的相關信息,請參閱 繼承。

範例

此範例定義了一個名為 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# 語言規格的 Override 方法一節。

欲了解更多關於協變回傳類型,請參閱 C# 語言規範中的 協變回傳類型 。

另請參閱