繁体   English   中英

Java集合:接口和抽象类

[英]Java Collections: Interfaces and Abstract classes

所有集合实现接口集合 ,这些集合具有特定的抽象层次结构,例如

但也有相应的接口,如CollectionListSet 这些界面在我看来有点多余。

他们为什么在这里? 是仅仅是约定还是有理由只实现接口而不扩展抽象类。

接口是存在的,因为能够在不强制实现的情况下将类型分配给变量或参数是很好的。

例如,如果我创建一个在Hibernate中使用的持久化实体,并且它有一组东西,我想为它分配一个List或Set类型。 Hibernate会将我初始化它的任何列表换成自己的,使用一些特定于Hibernate的实现来执行延迟加载或其他任何需要它的东西。 Hibernate开发人员可能不希望受到必须扩展抽象类的约束。

抽象类的存在是为了实现者的便利。 接口是客户使用的合同。

实现接口与扩展抽象类有很大不同。

让我们假设Animal类是一个抽象类,Dog,Cat,Snake和Shark扩展Animal。

默认的Animal.move()实现只是移动它们。

但是,接口允许我们进一步分组出类似的动物,例如RunningAnimal,SwimmingAnimal。

因此,如果Dog扩展Animal实现了RunningAnimal,那么沿着继承的move(),他还必须实现自己的run(),这可能会在从Animal继承的重写move()中找到它。 这对你有意义还是我需要更好地澄清一些代码? :)

接口允许您对不同类的类似功能进行分组。 “可点击”,“可排序”,“可序列化”......它们都通过共享功能包含成员(因此可点击列表不仅仅是按钮列表)而不是相同的目的。

所以,想想这样吧

Cat extends Animal implements RunningAnimal, ClimbingAnimal  -- inherits move() has to implement run() and climbTree()
Dog extends Animal implements RunningAnimal  -- inherits move(), has to implement run()
Snake extends Animal                         -- likely overrides inherited move()
Shark extends Animal implements SwimmingAnimal -- likely overrides move(), has to implement swim()

为什么不 ? 抽象类用于简化继承过程。 当您想要创建您的收藏时,您不必从头开始做所有事情。

但当然没有人告诉你,你应该继承自AbstractCollection。 您可以从头开始编写实现。

这是API具有接口的常见良好实践。 并且区分实现和接口。

接口是用户和实现者之间签订的合同。 抽象基类旨在用作访问许多类似行为对象的公共基础。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM