新手在这里。我的部分工作是询问用户他们的来电所属的两个类别中的哪一个。
我想这样做:
String choice = null;
System.out.printf("Please enter a 'A' for Category A%n");
System.out.printf("Please enter a 'B' for Category B%n");
//[Input validation/exception handling stuff goes here]
switch(choice){
case "A":
CategoryA objectName = new CategoryA();
break;
case "B":
CategoryB objectName = new CategoryB();
break;
}
但当然这不起作用,因为
程序的其余部分使用objectName。如果我必须有两个不同的对象名称,那么每次使用objectName时我都必须有一个if / else语句或switch语句,对吧?我甚至无法将对象传递给函数,因为它是一个类或另一个类。我在这里缺少一些解决方案吗?
答案 0 :(得分:4)
是的,编程到常见的PhoneCall
界面
PhoneCall phoneCall = null;
switch(choice){
case "A":
phoneCall = new CategoryA();
break;
case "B":
phoneCall = new CategoryB();
break;
}
if (phoneCall != null) {
// ...
}
但是,我认为使用简单的if-else if
之类的
PhoneCall phoneCall = null;
if ("A".equals(choice)) {
phoneCall = new CategoryA();
} else if ("B".equals(choice)) {
phoneCall = new CategoryB();
}
答案 1 :(得分:3)
所以你想要使用的是多态性。当您声明父类(或接口)的对象,但将其初始化为子类时。
例如,如果您有一个带有子类B和C的接口A,请执行以下操作:
InterfaceA obj;
if(x){
obj = new ClassB(parameters);
} else {
obj = new ClassC(parameters);
}
将创建B类或C类。 因为它们列在父类下,所以只能调用父类具有的方法。换句话说,如果B类具有唯一的方法,除非您将对象转换为该类型,否则无法调用该方法:
ClassB objB = (ClassB) obj;
objB.uniqueMethod();
但是,如果obj不是ClassB,则会抛出错误,因此您首先需要检查obj是否是ClassB:
if(obj instanceOf ClassB){
ClassB objB = (ClassB) obj;
objB.uniqueMethod();
}
这样你就可以确保在执行之前可以将obj强制转换为ClassB。
这适用于接口或类。