abstract (C# リファレンス)

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

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


      abstract class ShapesClass
{
    abstract public int Area();
}
class Square : ShapesClass
{
    int x, y;
    // Not providing an Area method results
    // in a compile-time error.
    public override int Area()
    {
        return x * y;
    }
}

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

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

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

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

  • 抽象クラスを sealed (C# リファレンス) 修飾子で修飾することはできません。つまり、クラスは継承されません。

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

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

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

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

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

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

    public abstract void MyMethod();
    
  • この実装はオーバーライドするメソッドによって用意されoverride (C# リファレンス)、非抽象クラスのメンバとなります。

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

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

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

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

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

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

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

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

// abstract_keyword.cs
// Abstract Classes
using System;
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);
    }
}

出力

x = 111, y = 161

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

BaseClass bc = new BaseClass();   // Error

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

詳細については、「C# 言語仕様」の次のセクションを参照してください。

  • 1.6.5.4 仮想メソッド、オーバーライド メソッド、抽象メソッド

  • 10.1.1.1 抽象クラス

表示: