在下图中,AbstractPainter
是一个抽象类,它实现了IPainter
。 ContemporaryPainter
和PastPainter
是扩展AbstractPainter
的类。考虑到这一点,做PastPainter
和AbstractPainter
延伸IPainter
?或者他们只扩展AbstractPainter
?抽象类的继承
谢谢!
在下图中,AbstractPainter
是一个抽象类,它实现了IPainter
。 ContemporaryPainter
和PastPainter
是扩展AbstractPainter
的类。考虑到这一点,做PastPainter
和AbstractPainter
延伸IPainter
?或者他们只扩展AbstractPainter
?抽象类的继承
谢谢!
在Java中,思考它的正确方法是扩展抽象类并实现接口。例如,LinkedList
实现List
接口和AbstractSequentialList
。
它们只延伸AbstractPainter
。他们确实实施了IPainter
。所以你可以做
IPainter painter = new PastPainter();
AbstractPainter otherPainter = new ContemporaryPainter();
它仍然是有效的。
然而,在集合中引用它们的时候,就像
List<? extends IPainter> list = new ...
它仍然使用这个词“扩展”。尽管如此,你仍然不会称之为“扩展界面”。
唯一的“扩展接口”是,如果你做的东西像下面的代码片段:
public interface IPolymath extends IPainter {
List<String> getOtherProfessions();
}
当一些其他的接口扩展了原有的接口。
谢谢,这是很好的帮助!但是,如果我想实现一个关于泛型类型画家的通用方法呢?我是否使用
你可以用任何一个做。如果你有其他的'IPainter',并且你也想包含它们,那么使用'T extends IPainter'。如果你想排除这些,使用'AbstractPainter'。如果你没有,也没有其他任何人,那么这没关系。 – corsiKa
太棒了,这很清楚。谢谢您的帮助! –
是PastPainter
和ContemporaryPainter
类型为IPainter
,因为它们延伸AbstractPainter
,其实现IPainter
。
例如:假设ClassA
要么实现要么扩展ClassB
。然后如果ClassC
扩展/实现了ClassA
,则自动ClassC
也是ClassB
的类型。
任何子类都是其超类的类型,也是它的超类继承的类型。
从语义的角度来看,你的例子中的接口和abtract类是多余的。抽象类的定义就足够了。但是,清楚的UML遵守你的问题的答案是,AsbtractPainter不直接实现接口IPainter,而是专门为你抽象类而不是抽象的类的实例。定义专业课可以替代一般专业课也很重要。
这里有一个明显缺乏图表。 – corsiKa
由于某种原因该图的图片没有显示:[链接](http://i.stack.imgur.com/zGHoE.png) –