我会发布一些代码,然后问我的问题,因为我认为需要一些解释。 所以这是我的超类的基本表示:
public abstract class ModeOfTransport {
public abstract void updateView(String name);
}
以下是我的子类的一些示例:
public class Bus extends ModeOfTransport {
@Override
public void updateView(String stopName) {
System.out.println("BUS");
}
}
public class Train extends ModeOfTransport {
@Override
public void updateView(String stopName) {
System.out.println("TRAIN");
}
}
我有一个switch
,可以决定调用哪个版本的updateView()
:
switch(transportType) {
case BUS:
handleInfo(new Bus());
break;
case TRAIN:
handleInfo(new Train());
break;
default:
break;
}
private void handleInfo(ModeOfTransport transportType) {
transportType.updateView(name);
}
我的目标是打印出TRAIN
或BUS
。目前,它什么都没打印!我猜是因为它在父类中调用抽象方法,它没有主体。
任何人都可以为我解释这个问题吗?
此外,作为附带问题,这是否属于polymorphism
或inheritance
?
谢谢!
答案 0 :(得分:6)
我已经成功了。我不知道你做错了什么,但也许你会从这个源代码中弄明白。
package transport;
/**
* ModeOfTransport description here
* @author Michael
* @link http://stackoverflow.com/questions/14097153/java-subclass-abstract-method-not-being-called/14097167#14097153
* @since 12/30/12 10:46 PM
*/
public abstract class ModeOfTransport {
public abstract void updateView(String name);
}
package transport;
/**
* Bus description here
* @author Michael
* @link http://stackoverflow.com/questions/14097153/java-subclass-abstract-method-not-being-called/14097167#14097153
* @since 12/30/12 10:47 PM
*/
public class Bus extends ModeOfTransport {
@Override
public void updateView(String name) {
System.out.println("BUS");
}
}
package transport;
/**
* Train description here
* @author Michael
* @link
* @since 12/30/12 10:48 PM
*/
public class Train extends ModeOfTransport {
@Override
public void updateView(String name) {
System.out.println("TRAIN");
}
}
package transport;
/**
* TransportVisitor description here
* @author Michael
* @link http://stackoverflow.com/questions/14097153/java-subclass-abstract-method-not-being-called/14097167#14097153
* @since 12/30/12 10:49 PM
*/
public class TransportVisitor {
public static void main(String[] args) {
TransportVisitor visitor = new TransportVisitor();
String [] types = { "TRAIN", "BUS" };
for (String type : types) {
visitor.updateView(type);
}
}
public void updateView(String transportTypeName) {
switch(transportTypeName) {
case "BUS":
handleInfo(new Bus());
break;
case "TRAIN":
handleInfo(new Train());
break;
default:
break;
}
}
private void handleInfo(ModeOfTransport transportType) {
transportType.updateView((String) null);
}
}
答案 1 :(得分:2)
您的方法名称不一致。您的基类有updateView
,但您的派生类有updateWebView
此外,由于您还没有使用任何基类方法,这将属于多态,这意味着您可以使用接口你自找的。