17

抽象骨格実装クラスを提供することにより、インターフェイスと抽象クラスを組み合わせることができることを示唆しているEffective Java Item 18から。シミュレートされた多重継承のスケルトン実装をいつ使用する必要があるのだろうか? 長所と短所は何ですか?誰かが例を挙げることができますか?

4

1 に答える 1

19

あなたが言う「骨格クラス」のポイントは、主に、デザインの使用を管理する特定の基本ルールを適用することです。インターフェイスと抽象クラスだけでは、その仕事を行うことはできません。たとえば、インターフェースを考えてみましょう

  1. メソッドに関する実装の詳細を指定することはできません
  2. インターフェイス レベルで指定された変数は静的である必要があります。
  3. インターフェイスは何も実装できません (クラスまたはインターフェイス)

したがって、これは、設計のルールを指定するためにインターフェースのみを使用しても、インターフェースで定義された操作の悪用を許可することを意味し、重要なクラス レベルの変数を指定したり、継承を十分に活用したりすることはできません。

次に、抽象クラスを取得します

  1. Java は多重継承をサポートしていないため、複数のクラス、abstract などの利点を引き出すことはできません。
  2. インターフェイスは(私にとって)ポリモーフィズムツリーの最上位にあるため、抽象クラスベースの設計からポリモーフィズムの完全な利点を引き出すことはできません。

両方を組み合わせると、両方の長所が得られます

  1. 抽象クラスはインターフェイスを実装できます。実装クラスは、抽象クラスを拡張して、既に実装されているインターフェイスのメソッドの利点を引き出すことができます。そして、この連鎖は、具体的な実装まで、必要な数の抽象クラスに対して続けることができます
  2. 実装クラスは、マーカー タイプの目的で必要な数のインターフェイスを実装できます。したがってSerializable、他のインターフェースによって拡張されるマーキング用のタイプインターフェースをいくつでも持つことができます
  3. (インターフェイスを実装する) 抽象クラスを実装するクラスは、抽象クラスの子としてインスタンス化されている間、より良いポリモーフィズムの恩恵を受けるために、インターフェイスの型として定義できます。

このユースケースを検討してください

  • たとえば、クラスの使用を管理する約6つのメソッドを持つインターフェイスがあり、識別目的でのみ必要なマーカーインターフェイスがあるため、おそらくinstanceOf演算子を使用できます。
  • 最初のインターフェイスでは、これらのメソッドのうち 3 つだけの特定の実装を強制する必要があります。残りの 3 つは、クラスのエンド ユーザーに任せることになります。
  • したがって、インターフェイス A には 6 つのメソッド定義があり、インターフェイス B は、クラスが「私はタイプ B クラスです」と言うためのマーカーにすぎません。これで、抽象クラスであるクラス A がインターフェイス A と B の両方を実装します。
  • 抽象クラスでは、必要な 3 つのメソッドのみを実装します。次に、他の 3 つのメソッドの実装の詳細をその抽象クラスの最終消費者に任せます。
于 2012-11-18T02:46:11.253 に答える