使用接口和抽象类

不是

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

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

public String createPlan(IPlan plan) {}

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

public String createPlan(AbstractPlan plan) {}

还是这个模型完全错误?

如果每个中都会存在实例变量IPlan,不管IPlan它是什么类型,那么拥有一个abstract定义变量类是合适的。事实上,您可能会考虑只定义抽象类,而不是接口。如果接口的唯一用途是让抽象类实现它,而其他一切都是抽象类的子类,那么接口就没有多大用处。

如果不同类型的IPlans的变量不同,则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总是不好;但真正需要它的情况相对较少,通常您应该寻找替代方案。]

PS使用I来指示接口是 Java 程序员倾向于嗤之以鼻的 C# 约定。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章