1. 程式人生 > 其它 >C#——關鍵字:override

C#——關鍵字:override

技術標籤:C#c#

C#——關鍵字:override

擴充套件或修改繼承的方法、屬性、索引器或事件的抽象或虛擬實現需要 override 修飾符。

在以下示例中,Square 類必須提供 GetArea 的重寫實現,因為 GetArea 繼承自抽象 Shape 類:

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 方法提供從基類繼承的方法的新實現。 通過 override 宣告重寫的方法稱為重寫基方法。 override 方法必須具有與重寫基方法相同的簽名。 從 C# 9.0 開始,override 方法支援協變返回型別。 具體而言,override 方法的返回型別可從相應基方法的返回型別派生。 在 C# 8.0 和更早版本中,override 方法和重寫基方法的返回型別必須相同。

不能重寫非虛方法或靜態方法。 重寫基方法必須是 virtual、abstract 或 override。

override 宣告不能更改 virtual 方法的可訪問性。 override 方法和 virtual 方法必須具有相同級別訪問修飾符。

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

重寫屬性宣告必須指定與繼承的屬性完全相同的訪問修飾符、型別和名稱。 從 C# 9.0 開始,只讀重寫屬性支援協變返回型別。 重寫屬性必須為 virtual、abstract 或 override。

示例

此示例定義一個名為 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 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($"Employee1 {employee1.name} earned: {employee1.CalculatePay()}");
        Console.WriteLine($"Employee2 {employee2.name} earned: {employee2.CalculatePay()}");
    }
}
/*
    Output:
    Employee1 Alice earned: 1500
    Employee2 Bob earned: 1200
*/