abstract (C# リファレンス)abstract (C# Reference)

abstract 修飾子は、その修飾対象の実装が不足しているか、不完全であることを示します。The abstract modifier indicates that the thing being modified has a missing or incomplete implementation. クラスやメソッド、プロパティ、インデクサー、イベントと組み合わせて abstract 修飾子を使用することができます。The abstract modifier can be used with classes, methods, properties, indexers, and events. クラス宣言に abstract 修飾子を使用して、クラスは他のクラスの基底クラスとしてのみ使用することを意図し、それ自体ではインスタンス化されないことを示します。Use the abstract modifier in a class declaration to indicate that a class is intended only to be a base class of other classes, not instantiated on its own. abstract としてマークされたメンバーは、その抽象クラスから派生した非抽象クラスによって実装される必要があります。Members marked as abstract must be implemented by non-abstract classes that derive from the abstract class.

Example

この例で、GetArea の機能は、Shape から派生している Square クラスで実装する必要があります。In this example, the class Square must provide an implementation of GetArea because it derives from Shape:

abstract class Shape
{
    public abstract int GetArea();
}

class Square : Shape
{
    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

抽象クラスには次の特徴があります。Abstract classes have the following features:

  • 抽象クラスはインスタンス化できません。An abstract class cannot be instantiated.

  • 抽象クラスには抽象メソッドとアクセサーを記述することができます。An abstract class may contain abstract methods and accessors.

  • sealed 修飾子を使って抽象クラスを修飾することはできません。2 つの修飾子が逆の意味を持つためです。It is not possible to modify an abstract class with the sealed modifier because the two modifiers have opposite meanings. sealed 修飾子を指定したクラスは継承が禁止されるのに対し、abstract 修飾子を指定したクラスは継承による使用が強制されます。The sealed modifier prevents a class from being inherited and the abstract modifier requires a class to be inherited.

  • 抽象クラスから派生した具象クラスには、継承されたすべての抽象メソッドとアクセサーの実際の機能を実装する必要があります。A non-abstract class derived from an abstract class must include actual implementations of all inherited abstract methods and accessors.

メソッドまたはプロパティに機能が実装されていないことを示すには、そのメソッドまたはプロパティの宣言で abstract 修飾子を使います。Use the abstract modifier in a method or property declaration to indicate that the method or property does not contain implementation.

抽象メソッドには次の特徴があります。Abstract methods have the following features:

  • 抽象メソッドは、仮想メソッドの性質を暗に含んでいます。An abstract method is implicitly a virtual method.

  • 抽象メソッドの宣言は、抽象クラスでしか認められません。Abstract method declarations are only permitted in abstract classes.

  • 抽象メソッドの宣言には実際の機能が実装されないため、メソッドの本体はありません。つまり、メソッドの宣言は、末尾のセミコロンがあるだけで、シグネチャの後ろに中かっこ ({ }) は存在しません。Because an abstract method declaration provides no actual implementation, there is no method body; the method declaration simply ends with a semicolon and there are no curly braces ({ }) following the signature. 例:For example:

    public abstract void MyMethod();  
    

    実際の機能は、メソッド (具象クラスのメンバー) に override を指定して実装します。The implementation is provided by a method override, which is a member of a non-abstract class.

  • 抽象メソッドの宣言に static 修飾子や virtual 修飾子を使うのは誤りです。It is an error to use the static or virtual modifiers in an abstract method declaration.

抽象プロパティは、宣言と呼び出しの構文の違いを除けば、抽象メソッドと似た働きを持ちます。Abstract properties behave like abstract methods, except for the differences in declaration and invocation syntax.

  • abstract 修飾子を静的プロパティに対して使うのは誤りです。It is an error to use the abstract modifier on a static property.

  • 継承する抽象プロパティは、派生クラス内で override 修飾子を使ったプロパティ宣言を記述することでオーバーライドすることができます。An abstract inherited property can be overridden in a derived class by including a property declaration that uses the override modifier.

抽象クラスの詳細については、「抽象クラスとシール クラス、およびクラス メンバー」を参照してください。For more information about abstract classes, see Abstract and Sealed Classes and Class Members.

すべてのインターフェイス メンバーの機能は、抽象クラスで実装する必要があります。An abstract class must provide implementation for all interface members.

インターフェイスを実装する抽象クラスで、インターフェイス メソッドを抽象メソッドにマップすることもできます。An abstract class that implements an interface might map the interface methods onto abstract methods. 例:For example:

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

Example

この例の DerivedClass クラスは、抽象クラス BaseClass から派生しています。In this example, the class DerivedClass is derived from an abstract class BaseClass. この抽象クラスには、AbstractMethod という抽象メソッドのほか、XY の 2 つの抽象プロパティが存在します。The abstract class contains an abstract method, AbstractMethod, and two abstract properties, X and Y.

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()
    {
        var o = new DerivedClass();
        o.AbstractMethod();
        Console.WriteLine($"x = {o.X}, y = {o.Y}");
    }
}
// Output: x = 111, y = 161

この例の抽象クラスを次のようなステートメントでインスタンス化しようとするとどうなるかを次に示します。In the preceding example, if you attempt to instantiate the abstract class by using a statement like this:

BaseClass bc = new BaseClass();   // Error  

このように、抽象クラス 'BaseClass' のインスタンスをコンパイラが作成できないことを伝えるエラーが発生します。You will get an error saying that the compiler cannot create an instance of the abstract class 'BaseClass'.

C# 言語仕様C# Language Specification

詳細については、「C# 言語の仕様」を参照してください。For more information, see the C# Language Specification. 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。The language specification is the definitive source for C# syntax and usage.

関連項目See also