次の方法で共有


override (C# リファレンス)

override 修飾子は、継承したメソッド、プロパティ、インデクサー、またはイベントの抽象実装や仮想実装を拡張したり修飾したりする際に必要です。

使用例

この例では、Square クラスが Area のオーバーライド実装を提供する必要があります。これは、Area が抽象 ShapesClass から継承されているためです。


abstract class ShapesClass
{
    abstract public int Area();
}
class Square : ShapesClass
{
    int side = 0;

    public Square(int n)
    {
        side = n;
    }
    // Area method is required to avoid
    // a compile-time error.
    public override int Area()
    {
        return side * side;
    }

    static void Main() 
    {
        Square sq = new Square(12);
        Console.WriteLine("Area of the square = {0}", sq.Area());
    }

    interface I
    {
        void M();
    }
    abstract class C : I
    {
        public abstract void M();
    }

}
// Output: Area of the square = 144

override メソッドは、基本クラスから継承されたメンバーの新しい実装を提供します。override 宣言によってオーバーライドされたメソッドを、オーバーライドされた基本メソッドと言います。オーバーライドされた基本メソッドは、override メソッドと同じシグネチャを持つ必要があります。継承の詳細については、「継承 (C# プログラミング ガイド)」を参照してください。

非仮想メソッドまたは静的メソッドのオーバーライドはできません。オーバーライドされる基本メソッドは、virtual、abstract、または override のいずれかである必要があります。

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

override メソッドの修飾に、修飾子 new、static、または virtual は使用できません。

オーバーライドのプロパティ宣言では、継承されるプロパティと正確に同じアクセス修飾子、型、および名前を指定する必要があります。オーバーライドされるプロパティは、virtual、abstract、または override である必要があります。

override キーワードの使い方の詳細については、「Override キーワードと New キーワードによるバージョン管理 (C# プログラミング ガイド)」および「Override キーワードと New キーワードを使用する場合について (C# プログラミング ガイド)」を参照してください。

この例では、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 derrived 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.
        SalesEmployee employee1 = new SalesEmployee("Alice", 
                      1000, 500);
        Employee employee2 = new Employee("Bob", 1200);

        Console.WriteLine("Employee4 " + employee1.name + 
                  " earned: " + employee1.CalculatePay());
        Console.WriteLine("Employee4 " + employee2.name + 
                  " earned: " + employee2.CalculatePay());
    }
}
/*
    Output:
    Employee4 Alice earned: 1500
    Employee4 Bob earned: 1200
*/

C# 言語仕様

詳細については、「C# 言語仕様」を参照してください。言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。

参照

関連項目

継承 (C# プログラミング ガイド)

C# のキーワード

修飾子 (C# リファレンス)

abstract (C# リファレンス)

virtual (C# リファレンス)

new (C# リファレンス)

ポリモーフィズム (C# プログラミング ガイド)

概念

C# プログラミング ガイド

その他の技術情報

C# リファレンス