我正在尝试了解接口(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/