在下图中,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
了 which implements IPainter
。
例如:假设ClassA
implements 或 extends ClassB
。然后如果ClassC
extends/implements ClassA
then 自动ClassC
也是ClassB
.
任何子类都是它的超类的类型,也是它的超类继承自的类型。
在 Java 中,正确的思考方式是扩展抽象类并实现接口。
例如,aLinkedList
实现了List
接口,而AbstractSequentialList
.
从语义的角度来看,您示例中的接口和抽象类是多余的。抽象类的定义就足够了。但是,对您的问题的明确符合 UML 的答案是,AsbtractPainter 不直接实现接口 IPainter,而是专门为您抽象类而不是抽象的类的实例。定义专用类可以替代通用类也很重要。