Java 使用接口和抽象类
我试图学习接口和抽象类及其用法 比如说,我有一个Java 使用接口和抽象类,java,interface,abstract-class,Java,Interface,Abstract Class,我试图学习接口和抽象类及其用法 比如说,我有一个接口IPlan。有三个班级实施它,学校计划、高中计划、大学计划。如果我想编写一个createPlan()服务方法来接受这三个计划类型对象中的任何一个,我该怎么做? 在我的服务课上,如果我做 public String createPlan(IPlan plan) {} 因为传递的对象将被实例化为IPlan,我将无法访问我要创建的对象的变量。 那么,我应该引入抽象类吗 public String createPlan(AbstractPlan pl
接口IPlan
。有三个班级实施它,学校计划、高中计划、大学计划
。如果我想编写一个createPlan()
服务方法来接受这三个计划类型对象中的任何一个,我该怎么做?
在我的服务课上,如果我做
public String createPlan(IPlan plan) {}
因为传递的对象将被实例化为IPlan,我将无法访问我要创建的对象的变量。
那么,我应该引入抽象类吗
public String createPlan(AbstractPlan plan) {}
还是这个模式完全错了 在接口中,您不能在那里实现您的方法,只需定义它们即可。 根据您的示例,让我们尝试执行以下操作:
interface IPlan {
String createPlan();
}
public abstract class APlan implements IPlan {
@Override
String createPlan() {
//do something in general for schoolplan, collegeplan, highschoolplan.
}
}
public class SchoolPlan extends APlan {
@Override
String createPlan() {
super();
//do something unique for school plan here.
}
}
另外,如果使用接口方法,则不能使用多态数组,但必须使类继承。如果每个
IPlan
中都存在实例变量,则无论是哪种IPlan
,都应该有一个定义变量的抽象
类。事实上,您可以考虑只定义抽象类,而不考虑接口。如果接口的唯一用途是让一个抽象类实现它,而其他所有东西都是抽象类的子类,那么接口就没有多大用处
如果不同类型的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
的哪些部分在所有类之间是通用的,以及不同子类之间有哪些不同之处?不同的东西可以转化为方法,您可以在抽象
类中定义这些方法(理想情况下,如果您的“服务类”在同一个包中,您可以将它们设置为受保护的
方法,以便createPlan
可以使用它们,但它们不会在其他任何地方都可用)。例如,如果createPlan
返回的字符串包含包含计划描述的标题,但描述取决于每个计划类型特有的不同变量,则可以定义在每个类中实现的getDescription()
抽象方法
[我并不是说instanceof
总是不好的;但真正需要它的情况相对较少,通常你应该寻找替代方案。]
另外,使用
I
表示接口是一种C#约定,Java程序员往往对此嗤之以鼻。您能举个例子说明您想要访问的变量以及您打算使用它们做什么吗?是的,如果您有多个共享属性,并且希望在所有这些类上实现一个方法,您应该使用抽象类。这createPlan
应该做什么?它返回一个字符串
?按照惯例,名为“createXXX`的东西应该返回一个XXX
。