我有一段时间没有做OOP所以我有点生疏了。 例如,我有一个租赁订阅的客户端,它有3种类型的订阅。如何在我的“订阅”类中选择抽象类和接口?
每个订阅必须具有价格,最长租赁期和最大租期。
根据我的记忆,我会在这里使用接口但是如何强制其他实现订阅的类来指定这3个属性的值(常量)?
答案 0 :(得分:1)
如果您正在考虑定义所有实现共有的字段,则不能使用接口,因为接口不包含状态。它只能声明方法和常量。状态被视为实现的一部分,而不是类型信息。
但是,您可以定义三种抽象的getter方法 - getPrice()
,getDuration()
和getCount()
或类似的东西,并将这些方法的实际实现留给实现类。在这种情况下,您可以使用接口或抽象类。
如果您想要拥有一个对所有子类都通用的实现,那么您将选择一个抽象类。例如,如果您有特定的方式来执行“出租”,或“发送提醒给租客”或其他操作。这些方法将是具体的,只有上述三个获取者将是抽象的。
如果您没有任何常见操作,并且您发现自己只是使用抽象方法而没有别的,那么接口可能会为您提供最佳服务,尤其是因为Java是单继承,并且使用接口将允许您在创建具体类时扩展另一个类。
这些只是经验法则,而不是一成不变的规则。
答案 1 :(得分:0)
我认为抽象类在这种情况下更有意义。当您的类都处理相同的数据/方法但在方法逻辑上可能略有不同时,请使用抽象类。
当你有几个有很大差异但总是被约束到一组方法(接口方法)的类时,接口可能会更有用
答案 2 :(得分:0)
通常,在继承和多态的情况下使用抽象。当您有一个对象可以根据其内部类型具有不同的行为。在需要合同时使用接口。通常,抽象最适合与密切相关的对象,而接口则根据其功能进行选择。
在你的情况下,抽象是有道理的。您可以在基类中保留相互属性,并从中派生其他类。消除一些冗余代码。
以下是MS的建议:以下是一些建议,可帮助您决定是使用接口还是抽象类为组件提供多态性。
*如果您预计要创建组件的多个版本,请创建一个抽象类。抽象类提供了一种简单易用的组件版本。通过更新基类,所有继承类都会随更改自动更新。另一方面,接口一旦创建就无法更改。如果需要新版本的接口,则必须创建一个全新的接口。
*如果您创建的功能在各种不同的对象中都有用,请使用界面。抽象类应主要用于密切相关的对象,而接口最适合为不相关的类提供通用功能。
*如果您正在设计小巧,简洁的功能,请使用接口。如果您正在设计大型功能单元,请使用抽象类。
*如果要在组件的所有实现中提供通用的,已实现的功能,请使用抽象类。抽象类允许您部分实现您的类,而接口不包含任何成员的实现。
https://msdn.microsoft.com/en-us/library/scsyfw1d(v=vs.71).aspx