gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:31:07 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com