次の図で、AbstractPainter
は を実装する抽象クラスIPainter
です。ContemporaryPainter
とPastPainter
は、 を拡張するクラスですAbstractPainter
。これを考慮して、?PastPainter
をAbstractPainter
拡張します。IPainter
それとも拡張するだけAbstractPainter
ですか?
ありがとう!
次の図で、AbstractPainter
は を実装する抽象クラスIPainter
です。ContemporaryPainter
とPastPainter
は、 を拡張するクラスですAbstractPainter
。これを考慮して、?PastPainter
をAbstractPainter
拡張します。IPainter
それとも拡張するだけAbstractPainter
ですか?
ありがとう!
それらは拡張するだけAbstractPainter
です。彼らは実装しIPainter
ます。だからあなたはできる
IPainter painter = new PastPainter();
AbstractPainter otherPainter = new ContemporaryPainter();
そして、それはまだ有効です。
ただし、コレクションでそれらを参照する場合は、
List<? extends IPainter> list = new ...
それはまだ「拡張」という言葉を使用しています。ただし、それを「インターフェースの拡張」とは呼びません。
唯一の「インターフェースを拡張する」のは、次のスニペットのようなものを作成した場合です。
public interface IPolymath extends IPainter {
List<String> getOtherProfessions();
}
他のインターフェイスが元のインターフェイスを拡張する場所。
はいPastPainter
、実装する拡張機能があるためContemporaryPainter
、タイプです。IPainter
AbstractPainter
IPainter
ClassA
例:実装または拡張のいずれかを想定しますClassB
。そして、ClassC
extends/implementsの場合はClassA
自動的ClassC
にのタイプでもありClassB
ます。
すべてのサブクラスは、そのスーパークラスと同じタイプであり、そのスーパークラスが継承されているタイプでもあります。
Java では、抽象クラスを拡張してインターフェースを実装するというのが正しい考え方です。
たとえば、 aはインターフェイスと をLinkedList
実装します。List
AbstractSequentialList