プログラミング言語において、抽象型(存在型とも呼ばれる)[1]は、直接インスタンス化できない名詞型システムの型です。対照的に、具象型は直接インスタンス化できます。抽象型のインスタンス化は、具象サブタイプを介して間接的にのみ行うことができます。
抽象型は、実装を提供しないか、不完全な実装を提供する場合があります。一部の言語では、実装のない抽象型 (不完全な実装ではなく) は、プロトコル、インターフェース、シグネチャ、またはクラス型として知られています。クラスベースの オブジェクト指向プログラミングでは、抽象型は抽象クラス(抽象基本クラスとも呼ばれる)として実装され、具象型は具象クラスとして実装されます。ジェネリックプログラミングでは、類似の概念は概念であり、同様に構文とセマンティクスを指定しますが、サブタイプの関係は必要ありません。つまり、無関係な 2 つの型が同じ概念を満たす場合があります。
多くの場合、抽象型には、インスタンス化できる具体的なサブタイプの形で、個別に提供される1つ以上の実装があります。オブジェクト指向プログラミングでは、抽象クラスには、そのサブクラスで共有される抽象メソッドまたは抽象プロパティ[2]が含まれる場合があります。抽象型を実装するために使用される(または使用される可能性がある)言語機能の他の名前には、特性、ミックスイン、フレーバー、ロール、または型クラスがあります。[引用が必要]
抽象型には、固定実装の不変メソッドと、具体的なサブクラスでオーバーライドしてカスタマイズされたロジックを提供できるフックメソッドを組み合わせて使用するテンプレート メソッド パターンを実装する場合など、任意の数の非抽象メソッドとプロパティを含めることもできます。
創造
抽象クラスは、いくつかの方法で作成、指定、またはシミュレートできます。
- Java、D、C#のように、クラス定義で明示的なキーワード を使用します。
abstract - クラス定義に、クラスがプロトコルの一部として受け入れるように宣言されているが実装が提供されていない1 つ以上の抽象メソッド( C++では純粋仮想関数と呼ばれる) を含めることによって。
- 抽象型を継承し、クラス定義を完了するために必要なすべての不足機能をオーバーライドしないことによって。言い換えれば、親からのすべての抽象メソッドを実装していない子型は、それ自体が抽象型になります。[2] [3]
- Smalltalkなどの多くの動的型付け言語では、特定のメソッドをthisに送信するが、そのメソッドを実装しないクラスは抽象クラスと見なすことができます。(ただし、Objective-Cなどの多くのそのような言語では、クラスが使用されるまでエラーは検出されず、実装されていないメソッドの検出時に呼び出される「セレクター xxx を認識しません」などの例外エラー メッセージが返されます
- [NSObject doesNotRecognizeSelector:(SEL)selector])。
例
ジャワ
デフォルトでは、abstract キーワードが使用されない限り、すべてのクラスのすべてのメソッドは具象です。抽象クラスには、実装のない抽象メソッドを含めることができます。デフォルトでは、default キーワードが使用されない限り、すべてのインターフェースのすべてのメソッドは抽象です。default キーワードは、インターフェースの具象メソッドを指定するために使用できます。
// デフォルトでは、abstract キーワードが使用されない限り、すべてのクラスのすべてのメソッドは具象です。public
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 ; } }
使用法
抽象型は、静的に型付けされたOOP 言語の重要な機能です。多くの動的型付け言語には同等の機能がありません (ただし、ダック タイピングを使用すると抽象型は不要になります)。ただし、最近の動的型付け言語には特性があります。 [引用が必要]
一部の著者は、クラスはリーフクラス(サブタイプを持たない)であるべきか、そうでなければ抽象クラスであるべきだと主張している。[4] [5]
抽象型は、プロトコル(プロトコルを実装するすべてのオブジェクトがサポートする必要がある一連の操作)を定義して強制するために使用できるという点で便利です。 [引用が必要]
抽象型は、テンプレート メソッド パターンの重要な部分でもあります。
参照
参考文献
- ^ ミッチェル、ジョン C.、プロトキン、ゴードン D.、抽象型には存在型がある、ACM Transactions on Programming Languages and Systems、第 10 巻、第 3 号、1988 年 7 月、470 ~ 502 ページ
- ^ ab 「抽象メソッドとクラス (Java チュートリアル > Java 言語の学習 > インタフェースと継承)」。Oracle.com。2019年 8 月 14 日閲覧。
- ^ 「C ++の純粋仮想関数と抽象クラス」。GeeksforGeeks.org。2014年 7 月 15 日。
- ^ リエル、アーサー (1996)。オブジェクト指向設計ヒューリスティックス。Addison-Wesley Professional。p. 89。ISBN 0-201-63385-X。
- ^ マイヤーズ、スコット (1996)。より効果的な C++。Addison-Wesley Professional。p. 258。ISBN 0-201-63371-X
非リーフクラスを抽象化
する
さらに読む
- Head First Java. O'Reilly Media. 2003. 688 ページ. ISBN 0-596-00920-8。
- Core Java: 統合アプローチ (R. Nageswara Rao 著)
外部リンク
- 「抽象的または骨格的なインターフェースの説明」[1]
- ベンジャミン・ピアース著『型とプログラミング言語』(MIT Press 2002)[2]
- Rosetta Codeの抽象型
