Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用接口和抽象类_Java_Interface_Abstract Class - Fatal编程技术网

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