3

私はここでブログ投稿を読んでいました: http://codeofdoom.com/wordpress/2009/02/12/learn-this-when-to-use-an-abstract-class-and-an-interface/

public interface Actor{
   Performance say(Line l);
}
public interface Director{
   Movie direct(boolean goodmovie);
}
public interface ActorDirector extends Actor, Director{
...
}

それは言う:実際には、ディレクターでもあるアクターがいます。抽象クラスではなくインターフェイスを使用している場合。抽象クラスを使用して同じことを達成できます。残念ながら、代替案では、すべての可能性をサポートするために、最大2^n (n は属性の数) の可能な組み合わせが必要になります。

質問: ここで抽象クラスが優れているのはなぜですか? なぜ 2^n なのか?

public abstract class ActorDirector implements Actor,Director{
}
4

4 に答える 4

6

複数のクラス (abstract または not) から継承することはできませんが、複数のインターフェイスを実装できます。

抽象クラスを作成する場合は、必要に応じて各組み合わせを確実に継承できるように、組み合わせごとに 1 つ必要です (n 属性: 2^n の可能な組み合わせ)。

インターフェイスを使用している場合は、n インターフェイス (属性ごとに 1 つ) を定義し、必要に応じて実装するだけで済みます。

于 2012-04-13T15:35:46.497 に答える
1

私はあなたが投稿を誤解したと思います:著者はこの状況では抽象クラスがより良いと主張していません-それどころか、彼はインターフェースがより適していると主張しています。

2^n(またはより正確に2^n-1)行く限り、その数は、直交する振る舞いのコントラクトがある場合、それらから空でない組み合わせをn作成できるという認識から来ています。2^n-1インターフェイスを使用して、それらを実装するクラスにコントラクトを追加する場合、必要なインターフェイスは動作の数だけです。ユーザーは、実装することを選択した動作の組み合わせを最大で作成でき2^n-1ます。抽象クラスで同じ柔軟性を実現しようとすると、Javaではクラスを一度に1つしか継承できないため、目的の実装だけでなく、単一のルートに至るまで必要なすべての中間実装も作成することになります。 。

于 2012-04-13T15:44:35.237 に答える
1

クラスが必要かどうかを判断する際に答えなければならない質問Abstractは単純です。

これらのインターフェースのいずれかを実装するクラス間で共有されるメソッドの共通実装はありますか? そうであれば、その実装をAbstractClass.

そうでない場合は、2 つを 1 つに結合し、Interfaceすべての実装クラスに独自の非共有実装を提供させます。

両方を行うには、間違いなく議論が必要です。単一の継承制限を回避できるスーパー インターフェースを用意しAbstract、そのスーパー インターフェースの実装も用意して、インターフェース内の任意のメソッドの共有デフォルト実装に高い結束力を提供します。

これらの問題を間違って解決する経験を積むほど、これらの決定はより簡単になります。

于 2012-04-13T15:37:44.707 に答える
0

継承には 2 つの部分があります。

  1. 派生クラスは、その親のパブリック メソッドまたはプロテクト メソッドまたはフィールドを、それ自体のものであるかのように見なすことができます。
  2. 派生型オブジェクトは、基本型オブジェクトが要求されるほとんどのコンテキストで、基本型オブジェクトの代わりに使用できます。

インターフェイスを実装するクラスは後者の利点しか得られませんが、抽象クラスから継承するクラスは両方を実現します。一方、その利点には制限があります。あるクラスは他の 1 つのクラスのメソッドとフィールドを自分のものと見なすことしかできないため、あるクラスは 1 つの抽象クラスからしか継承できません。対照的に、クラスは任意の数のインターフェイスを実装できます (したがって、置換可能になります)。

抽象クラスの組み合わせの爆発について心配する必要はありません。操舵できる車両 (CompactCar など)、AttachFollower できる車両 (RailwayLomotive など)、両方できる車両 (PickupTruck など) があるとします。できる車両を必要とするコードPickupTruckと、できる車両を必要とするコードを満たすことが可能であるべきです。ただし、とが両方とも抽象クラスである場合、1 つのインスタンスで両方の機能を実行できるように宣言する方法はありません。できる最善の方法は、「SteerableAndHitchable Steerable TrailerHitch 」を定義することですSteerAttachFollowerSteerAttachFollowerPickupTruckabstract class which inerits fromand includes amember of type付けられる』とはいえ、アビリティが二つだけでもそういうのはヤバい。タイプセーフな方法でより多くの機能を追加するには、爆発的な数のクラスが必要になるだけではありません。クラスごとにプロパティの数を増やす必要があります。

于 2012-04-13T16:30:49.337 に答える