Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在抽象类和接口之间进行选择_Java_Oop - Fatal编程技术网

Java 如何在抽象类和接口之间进行选择

Java 如何在抽象类和接口之间进行选择,java,oop,Java,Oop,我有一段时间没做OOP了,所以我有点生疏了。 例如,我有一个拥有租赁订阅的客户端,它存在3种类型的订阅。我如何在“订阅”类的抽象类和接口之间进行选择 每个订阅必须有价格、最长租赁期限和最长租赁数量 根据我的记忆,我会在这里使用接口,但如何强制实现订阅的其他类指定这3个属性的值(常量?我认为在这种情况下,抽象类更有意义。当所有类都处理相同的数据/方法,但方法逻辑可能略有不同时,请使用抽象类 如果您有几个差异很大的类,但应始终约束为一组方法(接口方法),则接口可能更有用。通常,在继承和多态性的情况下

我有一段时间没做OOP了,所以我有点生疏了。 例如,我有一个拥有租赁订阅的客户端,它存在3种类型的订阅。我如何在“订阅”类的抽象类和接口之间进行选择

每个订阅必须有价格、最长租赁期限和最长租赁数量


根据我的记忆,我会在这里使用接口,但如何强制实现订阅的其他类指定这3个属性的值(常量?

我认为在这种情况下,抽象类更有意义。当所有类都处理相同的数据/方法,但方法逻辑可能略有不同时,请使用抽象类


如果您有几个差异很大的类,但应始终约束为一组方法(接口方法),则接口可能更有用。通常,在继承和多态性的情况下,您使用抽象。当您拥有一个对象时,该对象可以根据其内部类型具有不同的行为。当需要合同时,使用接口。一般来说,抽象最适合于密切相关的对象,而接口是根据其功能选择的

在您的情况下,抽象是有意义的。您可以在基类中保留互属性,并从中派生其他类。消除一些冗余代码

MS建议如下:以下是一些建议,帮助您决定是使用接口还是抽象类为组件提供多态性

*如果您希望创建组件的多个版本,请创建一个抽象类。抽象类提供了一种简单易行的方法来对组件进行版本设置。通过更新基类,所有继承类都会随更改自动更新。另一方面,接口一旦创建就无法更改。如果需要新版本的接口,则必须创建一个全新的接口

*如果您正在创建的功能在各种不同的对象中都很有用,请使用接口。抽象类应该主要用于密切相关的对象,而接口最适合为不相关的类提供公共功能

*如果您正在设计小而简洁的功能,请使用接口。如果要设计大型功能单元,请使用抽象类

*如果希望在组件的所有实现中提供通用的、实现的功能,请使用抽象类。抽象类允许您部分实现类,而接口不包含任何成员的实现


如果您正在考虑定义所有实现所共有的字段,则不能使用接口,因为接口不包含状态。它只能声明方法和常量。状态被认为是实现的一部分,而不是类型信息

但是,您可以定义三个抽象getter方法-
getPrice()
getDuration()
getCount()
或类似的方法,并将这些方法如何工作的实际实现留给实现类。在这种情况下,您可以使用接口或抽象类

如果您有一些对所有子类都通用的实现,那么您应该选择一个抽象类。例如,如果您有执行“出租”或“向承租人发送提醒”或其他操作的特定方式。这些方法将是具体的,只有上述三个getter是抽象的

如果您没有任何公共操作,并且您发现自己只有抽象方法,而没有其他方法,那么接口可能会为您提供最好的服务,尤其是因为Java是单继承的,使用接口将允许您在创建具体类时扩展另一个类


不过,这些只是经验法则,而不是一成不变的规则。

这些不是.Net推荐,而是Java推荐吗?@realdupoint你说得对。我的错。但是他们在术语上非常接近。首先,我想让
接口
来描述
订阅的基本合同,这意味着您可以将实现接口的任何类传递给整个API,而无需API突然决定需要处理哪种类型的订阅。如果有必要,您可以使用从此扩展的其他接口来缩小范围。然后,您将使用抽象类来填充公共代码,从而更容易开发实际实现,并且不会在一开始就限制订阅数量……但这只是我的问题,归根结底是如何看待它的增长。您的API是否只关心某个对象是“订阅”的基本概念,还是需要更细的粒度?一般来说,我更喜欢使用接口,这使我能够定义任何实现所期望的基本契约,并使我能够概括API以接受所讨论的接口,这意味着我可以传递任何我想要的实现,而无需将它的实现暴露给API中不需要它的部分。然后使用抽象类来提供公共的“基本”实现,这有助于减少代码重复,并有助于提高生成自定义实现所需的时间……但这只是我自己。这就支持了“谢谢你的回答”的概念,它向我澄清了很多事情:)