我正在尝试了解接口和抽象类及其用途。
可以说,我有一个Interface IPlan
. 有三个类来实现它,schoolPlan, highSchoolPlan, collegePlan
. 如果我想编写一个createPlan()
接受这三个计划类型对象中的任何一个的服务方法,我该怎么做?在我的服务课上,如果我做类似的事情,
public String createPlan(IPlan plan) {}
由于传递的对象将被实例化为 IPlan,因此我将无法访问我要创建的对象的变量。所以,我应该引入抽象类,比如
public String createPlan(AbstractPlan plan) {}
还是这个模型完全错误?
如果每个中都会存在实例变量IPlan
,不管IPlan
它是什么类型,那么拥有一个abstract
定义变量的类是合适的。事实上,您可能会考虑只定义抽象类,而不是接口。如果接口的唯一用途是让抽象类实现它,而其他一切都是抽象类的子类,那么接口就没有多大用处。
如果不同类型的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
总是不好;但真正需要它的情况相对较少,通常您应该寻找替代方案。]
PS使用I
来指示接口是 Java 程序员倾向于嗤之以鼻的 C# 约定。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句