abstract (C# リファレンス)

abstract 修飾子は、修飾対象に実装が不足しているか、不完全な実装があることを示します。abstract 修飾子は、クラス、メソッド、プロパティ、インデクサー、およびイベントで使用できます。クラスの宣言に abstract 修飾子を使用した場合、クラスは他のクラスの基本クラスとなることだけを目的とします。抽象としてマークされているメンバー、または抽象クラスのメンバーは、抽象クラスから派生したクラスを使用して実装する必要があります。

使用例

この例では、Square クラスは ShapesClass から派生したクラスであるので、このクラスにより Area が実装されます。


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

抽象クラスには、以下に示す特徴があります。

  • 抽象クラスはインスタンス化できません。

  • 抽象クラスは、抽象メソッドおよび抽象アクセサーを含む可能性があります。

  • 抽象クラスを sealed (C# リファレンス) 修飾子で修飾することはできません。これは、2 つの修飾子が正反対の意味を持つためです。sealed 修飾子はクラスの継承を禁止し、abstract 修飾子はクラスの継承を要求します。

  • 抽象クラスから派生される非抽象クラスは、継承される抽象メソッドおよび抽象アクセサーの実際の実装をすべて含んでいる必要があります。

abstract 修飾子をメソッド宣言またはプロパティ宣言に使用すると、メソッドまたはプロパティに実装を含まないことを示します。

抽象メソッドには、以下に示す特徴があります。

  • 抽象メソッドは、暗黙的に virtual なメソッド (仮想メソッド) です。

  • 抽象メソッドの宣言は、抽象クラス内でだけ許可されます。

  • 抽象メソッドの宣言では実際の実装は用意されないので、メソッドの本体はなく、メソッドの宣言は単にセミコロンで終わり、シグネチャに続く中かっこ ({ }) はありません。次に例を示します。

    public abstract void MyMethod();
    

    メソッドの実装は、非抽象クラスのメンバーとしてオーバーライドされたメソッド (override (C# リファレンス)) によって提供されます。

  • 抽象メソッドの宣言で static 修飾子または virtual 修飾子を使用するとエラーになります。

抽象プロパティは抽象メソッドと同様に動作しますが、宣言の構文および呼び出しの構文に相違があります。

  • 静的プロパティで abstract 修飾子を使用するのはエラーです。

  • 継承された抽象プロパティを派生クラス内でオーバーライドできます。オーバーライドするには、override 修飾子を使用するプロパティ宣言を含めます。

抽象クラスの詳細については、「抽象クラスとシール クラス、およびクラス メンバー (C# プログラミング ガイド)」を参照してください。

抽象クラスは、すべてのインターフェイス メンバーの実装を用意する必要があります。

インターフェイスを実装する抽象クラスは、抽象メソッドにインターフェイス メソッドを割り当てることもあります。次に例を示します。

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

この例では、DerivedClass クラスは抽象クラス BaseClass の派生クラスです。この抽象クラスには AbstractMethod という抽象メソッドと、X および Y という 2 つの抽象プロパティがあります。

    abstract class BaseClass   // Abstract class
    {
        protected int _x = 100;
        protected int _y = 150;
        public abstract void AbstractMethod();   // Abstract method
        public abstract int X    { get; }
        public abstract int Y    { get; }
    }

    class DerivedClass : BaseClass
    {
        public override void AbstractMethod()
        {
            _x++;
            _y++;
        }

        public override int X   // overriding property
        {
            get
            {
                return _x + 10;
            }
        }

        public override int Y   // overriding property
        {
            get
            {
                return _y + 10;
            }
        }

        static void Main()
        {
            DerivedClass o = new DerivedClass();
            o.AbstractMethod();
            Console.WriteLine("x = {0}, y = {1}", o.X, o.Y);
        }
    }
    // Output: x = 111, y = 161

上の例で、次に示すようなステートメントを使用して抽象クラスのインスタンスの作成を試みるとします。

BaseClass bc = new BaseClass();   // Error

コンパイラが 'BaseClass' 抽象クラスのインスタンスを作成できないことを知らせるエラーが表示されます。

C# 言語仕様

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

参照

関連項目

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

virtual (C# リファレンス)

override (C# リファレンス)

C# のキーワード

概念

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

その他の技術情報

C# リファレンス