共用方式為


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傳回類型。 覆寫的屬性必須是 virtualabstractoverride

如需如何使用 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 方法一節。

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

另請參閱