次の方法で共有


override (C# リファレンス)

継承されたメソッド、プロパティ、インデクサー、またはイベントの抽象実装または仮想実装を拡張または変更するには、 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 メソッドの戻り値の型は、対応する基本メソッドの戻り値の型から派生できます。

非仮想メソッドまたは静的メソッドをオーバーライドすることはできません。 オーバーライドされる基本メソッドは、 virtualabstract、または overrideである必要があります。

override宣言では、virtual メソッドのアクセシビリティを変更できません。 override メソッドと virtual メソッドの両方に、同じアクセス レベル修飾子が必要です。

newstatic、またはvirtual修飾子を使用して、override メソッドを変更することはできません。

オーバーライドするプロパティ宣言では、継承されたプロパティとまったく同じアクセス修飾子、型、および名前を指定する必要があります。 読み取り専用のオーバーライド プロパティは、共変の戻り値の型をサポートします。 オーバーライドされるプロパティは、 virtualabstract、または 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# 言語仕様「メソッドのオーバーライド」セクションを参照してください。

共変の戻り値の型の詳細については、 機能提案のメモを参照してください。

こちらも参照ください