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
方法的傳回類型可以衍生自對應基底方法的傳回類型。
您無法覆寫非虛擬或靜態方法。 覆寫基底方法必須是 virtual
、abstract
或 override
。
override
宣告不能變更 virtual
方法的存取範圍。 override
方法和 virtual
方法都必須具有相同的存取層級修飾詞。
您不能使用 new
、static
或 virtual
修飾詞來修改 override
方法。
要覆寫的屬性宣告必須指定與繼承屬性完全相同的存取修飾詞、類型和名稱。 唯讀覆寫屬性支援 Covariant 傳回類型。 覆寫屬性必須是 virtual
, abstract
或 override
。
如需如何使用 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# 語言規格
如需 Covariant 傳回類型的詳細資訊,請參閱功能提案附註。