java - 使用接口(interface)和抽象类

标签 java interface abstract-class

我正在尝试了解接口(interface)和抽象类及其用途。

假设我有一个Interface IPlan。有三个类实现它,schoolPlan、highSchoolPlan、collegePlan。如果我想编写一个 createPlan() 服务方法来接受这三个计划类型对象中的任何一个,我该怎么做? 在我的服务类中,如果我做类似的事情,

public String createPlan(IPlan plan) {}

由于传递的对象将被实例化为 IPlan,因此我将无法访问我想要创建的对象的变量。 那么,我应该引入抽象类吗,比如

public String createPlan(AbstractPlan plan) {}

或者这个模型完全错误吗?

最佳答案

如果每个 IPlan 中都会存在实例变量,无论哪种IPlan是的,那么有一个 abstract 是合适的定义变量的类。事实上,您可能会考虑仅定义抽象类,而不是接口(interface)。如果接口(interface)的唯一用途是让一个抽象类实现它,而其他所有内容都是抽象类的子类,那么该接口(interface)就没有多大作用。

如果不同类型的 IPlan 的变量不同s,然后createPlan不应该尝试访问变量。编写这样的代码是初学者常见的错误

public String createPlan(AbstractPlan plan) {
    ...
    if (plan instanceof SchoolPlan) {
        return doSomethingWith(((SchoolPlan)plan).schoolType, ...)
    } else if (plan instanceof HighSchoolPlan) {
        return doSomethingElseWith(((HighSchoolPlan)plan).schedule, ...)
    ...
}

这违背了多态性的目的。相反,您可能想问: createPlan 的哪些部分所有类之间都是通用的,不同子类之间有哪些不同之处?不同的东西可以变成您在 abstract 中定义的方法。类(理想情况下,如果您的“服务类”位于同一个包中,您可以将它们设为 protected 方法,以便 createPlan 可以使用它们,但它们不能在其他地方使用)。例如,如果 createPlan 返回的字符串包含包含计划描述的标题,但描述取决于每个计划类型特有的不同变量,您可以定义 getDescription()您将在每个类中实现的抽象方法。

[我不是说instanceof总是不好;但真正需要它的情况相对较少,通常您应该寻找替代方案。]

附注使用I表示接口(interface)是 Java 程序员往往会嗤之以鼻的 C# 约定。

关于java - 使用接口(interface)和抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44252540/

相关文章:

java - 无法使用spring和hibernate集成自动创建表并插入记录

java - 如何在 Java 代码创建的 SQL 脚本文件中将 Java byte[] 转换为 MySQL BLOB

java - Spring Security OAuth2 cookie

c# - 接口(interface)作为函数的参数

C# - 在另一个方法中实现抽象或接口(interface)方法

未捕获 JavaFX 按键

java - 方法帮助-初学者错误

Python:如何创建一个继承自其他 ABC 的 ABC?

php - 抽象类的目的是什么?

扩展抽象类的Java过程