web-dev-qa-db-ja.com

抽象クラス/メソッドを使用するタイミングと理由

抽象クラス/メソッドについていくつかの基本的な質問があります。抽象クラスの基本的な用途は、将来のクラスのテンプレートを作成することです。しかし、それらの使用法は他にありますか?インターフェースよりもそれらを好むのはいつですか?また、抽象メソッドはいつ便利ですか?

44
Vishal

抽象クラスの基本的な用途は、将来のクラスのテンプレートを作成することです。しかし、それ以上の用途はありますか?

子のテンプレートを定義できるだけでなく、抽象クラスには、子クラスが後で利用できる機能を定義できるという利点もあります。

インターフェイスの実装を提供することはできません。

インターフェースよりもいつそれらを好むべきですか?

抽象クラスは、実装の詳細を子供に提供したいが、クラスのインスタンスを直接インスタンス化したくない(クラスを部分的に定義できる)場合に適しています。

オブジェクトが従うべきコントラクトを単に定義したい場合は、インターフェースを使用します。

また、抽象メソッドはいつ便利ですか?

抽象メソッドは、インターフェイスでメソッドを定義するのと同じように便利です。これは、Abstractクラスの設計者が「私の子はこのメソッドを実装しなければならない」と言う方法です。

58
Justin Niessner

次の記事を読む http://mycodelines.wordpress.com/2009/09/01/in-which-scenario-we-use-abstract-classes-and-interfaces/

抽象クラス

–>基本クラスが特定のメソッドのデフォルトの実装を提供する必要があり、他のメソッドが抽象クラスを使用して子クラスによってオーバーライドされるようにする必要がある場合。

たとえば再度、上記のVehicleクラスの例を取り上げます。 Vehicleから派生したすべてのクラスにDrive()メソッドを固定的な方法で実装する必要がある場合、他のメソッドは子クラスによってオーバーライドできます。このようなシナリオでは、Driveクラスを実装するVehicleクラスを抽象クラスとして実装し、他のメソッド/プロパティを抽象のままにして、子クラスでオーバーライドできるようにします。

–>抽象クラスの目的は、複数の派生クラスが共有できる基本クラスの共通定義を提供することです。

たとえば、クラスライブラリは、その機能の多くのパラメーターとして使用される抽象クラスを定義し、そのライブラリを使用するプログラマーに、派生クラスを作成してクラスの独自の実装を提供することを要求します。

抽象クラスを使用する

広く配布または再利用されるクラスライブラリを作成するとき(特にクライアントに)、インターフェイスよりも抽象クラスを使用します。なぜなら、バージョン管理が簡単になるからです。これは、ベースクラスライブラリを開発したMicrosoftチームが使用するプラクティスです。 (COMはインターフェイスを中心に設計されました。)抽象クラスを使用して、型のファミリに共通の基本クラスを定義します。抽象クラスを使用して、デフォルトの動作を提供します。クラスが論理的に属する階層内の基本クラスのみをサブクラス化します。

8
Ran

非常に高いレベルで:

あらゆる種類の抽象化は、懸念の分離に帰着します。抽象化の「クライアント」コードは、抽象化によって公開されるコントラクトがどのように満たされるかを気にしません。通常、たとえば文字列クラスがNULL終了またはバッファ長追跡の内部ストレージ実装を使用するかどうかは気にしません。カプセル化は詳細を隠しますが、クラス/メソッド/などを作成します。抽象的には、クライアントコードに影響を与えることなく、実装を変更したり、新しい実装を追加したりできます。

3

通常、抽象クラスを使用して、具体的なサブクラスによって具体化される不完全な機能を提供します。サブクラスで使用されるメソッドを提供する場合があります。また、クラス階層の中間ノードを表し、具象サブクラスの共通グループを表し、スーパークラスの他のサブクラスと何らかの形で区別することもできます。インターフェイスはクラスから派生できないため、これはインターフェイスに対してクラス(抽象またはそれ以外)が必要になる別の状況です。

経験則として、クラス階層のリーフノードのみをインスタンス化する必要があります。葉以外のノードを抽象化することは、それを保証する簡単な方法です。

1
Carl Manaster

通常、抽象クラス/メソッドは、クラスが高レベルの機能を提供するが、派生クラスによって実装される特定の詳細を除外する場合に使用されます。クラス/メソッドを抽象化すると、それを単独で使用することはできませんが、高レベルの実装から除外された詳細を定義するために特殊化する必要があります。これは、テンプレートメソッドパターンで最もよく使用されます。

http://en.wikipedia.org/wiki/Template_method_pattern

1
bshields