継承されたメソッド、プロパティ、インデクサー、またはイベントの抽象実装または仮想実装を拡張または変更するには、 override
修飾子が必要です。
次の例では、GetArea
は抽象Shape
クラスから継承されるため、Square
クラスはGetArea
のオーバーライドされた実装を提供する必要があります。
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
メソッドは共変の戻り値の型をサポートします。 特に、 override
メソッドの戻り値の型は、対応する基本メソッドの戻り値の型から派生できます。
非仮想メソッドまたは静的メソッドをオーバーライドすることはできません。 オーバーライドされる基本メソッドは、 virtual
、 abstract
、または override
である必要があります。
override
宣言では、virtual
メソッドのアクセシビリティを変更できません。
override
メソッドと virtual
メソッドの両方に、同じアクセス レベル修飾子が必要です。
new
、static
、またはvirtual
修飾子を使用して、override
メソッドを変更することはできません。
オーバーライドするプロパティ宣言では、継承されたプロパティとまったく同じアクセス修飾子、型、および名前を指定する必要があります。 読み取り専用のオーバーライド プロパティは、共変の戻り値の型をサポートします。 オーバーライドされるプロパティは、 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# 言語仕様
詳細については、C# 言語仕様の「メソッドのオーバーライド」セクションを参照してください。
共変の戻り値の型の詳細については、 機能提案のメモを参照してください。
こちらも参照ください
.NET