1

私の質問は非常に単純で、Iterable インターフェースのソース コードを偶然見たことがすべての始まりでした。このインターフェイスには、「AbstractIterator」などと呼ばれる抽象クラスのメンバーがあると思いましたが、インターフェイスであることがわかりました。

なんで?イテレータが抽象クラスではないのはなぜですか? インターフェイスは特定の特性を定義するために使用されます。そのため、多くのインターフェイスで「できる」という語尾が飛び出します。しかし、Java は別の見方をしているように見えます。説明してください... :)

Ps: リスト、セットなども、私の見解では、抽象クラスであると想定されているため、私の質問はそれらについても同様です...

4

3 に答える 3

3

の各実装はIterator、反復しているコレクションに固有です。これらは、抽象基本クラスを保証するのに十分な共通コードではありません。

つまり、インターフェイスの使用は、抽象クラスよりも制限が少ないということです。Java では、クラスは 1 つの基底クラスしか拡張できないことに注意してください。したがって、これらのインターフェイスが抽象クラスの場合、実装者は他のクラスを拡張できません。インターフェイスの葉を使用すると、実装者は完全なクラス階層の自由を得ることができます。

インターフェイスと抽象クラスを持つことは非常に一般的です。この組み合わせにより、インターフェイスを完全に自由に実装できますが、実装で抽象クラスを使用できる場合はコードを再利用できます。

于 2013-05-29T12:53:26.413 に答える
1

Java ではインターフェイスの多重継承のみが許可され、クラス (抽象クラスを含む) は単一継承のみを利用できます。したがってList、抽象クラスを作成する場合、機能要件やビジネス要件が何であれ、実装者にクラス設計に従うように強制します。さらに、1 つのクラスで異なる動作を実装することはできません。Stackたとえば、動作と動作を実装するものListは不可能です。

TableModel部分的な実装はしばしば有用であるため、JDK ではインターフェイス、抽象クラス、AbstractTableModelおよびデフォルトの実装のトリプティコンを見つけることがありますDefaultTableModel。クラス階層にどの程度バインドするかを選択できます。特定のクラスを使用することを強制する階層が既にある場合でも、インターフェイスを実装できます。

この点で、Java は非常に静的です。ここでは、他の言語よりも継承よりも構成を優先する必要があります。

于 2013-05-29T13:02:04.713 に答える