プログラミング言語では、抽象型(存在型とも呼ばれる)[ 1 ]は、直接インスタンス化できない命名型システムの型です。対照的に、具象型は直接インスタンス化できます。抽象型のインスタンス化は、具象サブタイプを介して間接的にのみ可能です。
抽象型は、実装を提供しない場合もあれば、不完全な実装を提供する場合もあります。一部の言語では、実装のない(不完全な実装ではなく)抽象型は、プロトコル、インターフェース、シグネチャ、またはクラス型と呼ばれます。クラスベースのオブジェクト指向プログラミングでは、抽象型は抽象クラス(抽象基底クラスとも呼ばれる)として、具象型は具象クラスとして実装されます。ジェネリックプログラミングでは、これに相当する概念はコンセプトであり、同様に構文と意味論を指定しますが、サブタイプの関係は必要としません。つまり、無関係な2つの型が同じコンセプトを満たす可能性があります。
抽象型には、多くの場合、インスタンス化可能な具体的なサブタイプの形式など、1 つ以上の実装が別途提供されます。オブジェクト指向プログラミングでは、抽象クラスには、サブクラス間で共有される抽象メソッドや抽象プロパティ[ 2 ]が含まれる場合があります。抽象型を実装するために使用される (または使用される可能性がある) 言語機能の他の名前には、トレイト、ミックスイン、フレーバー、ロール、または型クラスなどがあります。
抽象型には、任意の数の非抽象メソッドやプロパティが含まれる場合もあります。例えば、テンプレートメソッドパターンを実装する場合、固定実装の不変メソッドと、具象サブクラスでオーバーライドしてカスタマイズされたロジックを提供するフックメソッドを組み合わせて使用します。
抽象クラスは、いくつかの方法で作成、表現、またはシミュレートできます。
abstract- [NSObject doesNotRecognizeSelector:(SEL)selector]。)デフォルトでは、abstract キーワードを使用しない限り、すべてのクラスのすべてのメソッドは具象メソッドです。抽象クラスには、実装を持たない抽象メソッドを含めることができます。デフォルトでは、default キーワードを使用しない限り、すべてのインターフェースのすべてのメソッドは抽象メソッドです。default キーワードは、インターフェースに具象メソッドを指定するために使用できます。
// デフォルトでは、abstract キーワードが使用されない限り、すべてのクラスのすべてのメソッドは具象です。abstract class Demo { // 抽象クラスには、実装を持たない抽象メソッドを含めることができます。public abstract int sum ( int x , int y );// 抽象クラスには具体的なメソッドも含まれる場合があります。public int product ( int x , int y ) { return x * y ; } }// デフォルトでは、default キーワードを使用しない限り、すべてのインターフェースのすべてのメソッドは抽象メソッドです。interface DemoInterface { int getLength (); // ここでは abstract キーワードを使用できますが、完全に無意味です// このコンテキストでは、default キーワードを使用してインターフェースの具体的なメソッドを指定できますdefault int product ( int x , int y ) { return x * y ; } }![]()
抽象型は、静的型付けのオブジェクト指向言語において重要な機能です。多くの動的型付け言語には同等の機能はありませんが(ダックタイピングを使用すれば抽象型は不要になります)、一部の現代的な動的型付け言語にはトレイトが存在します。
一部の著者は、クラスはリーフクラス(サブタイプを持たない)であるべき、あるいは抽象クラスであるべきだと主張している。[ 4 ] [ 5 ]
抽象型は、プロトコルを定義し、強制するために使用できるという点で有用です。プロトコルとは、そのプロトコルを実装するすべてのオブジェクトがサポートしなければならない一連の操作のことです。
抽象型は、テンプレートメソッドパターンの重要な要素でもあります。
リーフクラスを抽象クラスにする