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
メソッドによってサポートされています。 特に、override
メソッドの戻り値の型は、対応する基本メソッドの戻り値の型から派生できます。
非仮想メソッドまたは静的メソッドをオーバーライドすることはできません。 オーバーライドされる基本メソッドは、virtual
、abstract
、override
のいずれかである必要があります。
override
宣言は、virtual
メソッドのアクセシビリティを変更できません。 override
メソッドと virtual
メソッドの両方に、同じアクセス レベル修飾子が必要です。
override
メソッドの修飾に、修飾子 new
、static
、または virtual
は使用できません。
オーバーライドするプロパティの宣言では、継承されるプロパティとまったく同じアクセス修飾子、型、および名前を指定する必要があります。 読み取り専用のオーバーライドするプロパティでは、共変の戻り値の型がサポートされています。 オーバーライドされたプロパティは、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