抽象クラス/メソッドについていくつかの基本的な質問があります。抽象クラスの基本的な使用法は、将来のクラスのテンプレートを作成することであることを私は知っています。しかし、それらの用途は他にありますか?いつインターフェースよりもそれらを好むべきで、いつそうでないのですか?また、抽象メソッドはいつ役に立ちますか?
5 に答える
抽象クラスの基本的な使用法は、将来のクラスのテンプレートを作成することであることを私は知っています。しかし、それらの用途は他にありますか?
子のテンプレートを定義できるだけでなく、抽象クラスには、子クラスが後で利用できる機能を定義できるという追加の利点があります。
Java 8より前のインターフェースでは、デフォルトのメソッド実装を提供できませんでした。
いつインターフェースよりもそれらを好むべきで、いつそうでないのですか?
抽象クラスは、実装の詳細を子に提供したいが、クラスのインスタンスを直接インスタンス化できないようにする(クラスを部分的に定義できるようにする)場合に適しています。
従うオブジェクトのコントラクトを単純に定義する場合は、インターフェイスを使用します。
また、抽象メソッドはいつ役に立ちますか?
抽象メソッドは、インターフェースでメソッドを定義するのと同じように役立ちます。これは、Abstractクラスの設計者が、「私の子はこのメソッドを実装する必要がある」と言う方法です。
抽象クラス
–>基本クラスが特定のメソッドのデフォルトの実装を提供する必要があるのに対し、他のメソッドは子クラスによってオーバーライドされる可能性があるという要件がある場合は、抽象クラスを使用します。
たとえば、上記のVehicleクラスの例をもう一度見てください。Vehicleから派生するすべてのクラスがDrive()メソッドを固定された方法で実装するようにしたいのに対し、他のメソッドは子クラスによってオーバーライドできる場合。このようなシナリオでは、Vehicleクラスを抽象クラスとして実装し、Driveを実装しますが、他のメソッド/プロパティは抽象のままにして、子クラスでオーバーライドできるようにします。
–>抽象クラスの目的は、複数の派生クラスが共有できる基本クラスの共通の定義を提供することです。
たとえば、クラスライブラリは、その関数の多くのパラメータとして使用される抽象クラスを定義し、そのライブラリを使用するプログラマーに、派生クラスを作成することによってクラスの独自の実装を提供するように要求する場合があります。
抽象クラスを使用する
広く配布または再利用されるクラスライブラリを作成する場合、特にクライアントに対しては、インターフェイスよりも抽象クラスを使用します。なぜなら、それはバージョン管理を単純化するからです。これは、基本クラスライブラリを開発したMicrosoftチームが使用した方法です。(COMはインターフェースを中心に設計されています。)抽象クラスを使用して、タイプのファミリーに共通の基本クラスを定義します。抽象クラスを使用して、デフォルトの動作を提供します。クラスが論理的に属する階層内の基本クラスのみをサブクラス化します。
非常に高いレベルで:
あらゆる種類の抽象化は、関心の分離に帰着します。抽象化の「クライアント」コードは、抽象化によって公開されたコントラクトがどのように実行されるかを気にしません。たとえば、文字列クラスがnullで終了するか、バッファ長が追跡される内部ストレージの実装を使用するかどうかは、通常は気にしません。カプセル化は詳細を隠しますが、クラス/メソッドなどを作成します。抽象的には、クライアントコードに影響を与えることなく、実装を変更したり、新しい実装を追加したりすることができます。
抽象クラス/メソッドは通常、クラスが高レベルの機能を提供するが、派生クラスによって実装される特定の詳細を省略している場合に使用されます。クラス/メソッドを抽象化すると、それ自体では使用できなくなりますが、高レベルの実装から除外された詳細を定義するために特化する必要があります。これは、テンプレートメソッドパターンで最もよく使用されます。
通常、抽象クラスを使用して、具体的なサブクラスによって具体化される不完全な機能を提供します。サブクラスで使用されるメソッドを提供する場合があります。また、クラス階層内の中間ノードを表し、具象サブクラスの一般的なグループを表し、スーパークラスの他のサブクラスと何らかの方法で区別することもできます。インターフェイスはクラスから派生できないため、これは、インターフェイスではなく、クラス(抽象またはその他)が必要になる別の状況です。
経験則として、クラス階層のリーフノードのみをインスタンス化する必要があります。非リーフノードを抽象化することは、それを確実にする簡単な方法です。