3

我会发布一些代码然后问我的问题,因为我认为它需要一些解释。所以这是我的超类的基本表示:

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);
}

我的目标是打印出TRAINBUS。目前,它什么也没打印!我猜是因为它调用了没有主体的父类中的抽象方法。

任何人都可以为我阐明这一点吗?

另外,作为一个附带问题,这是否属于polymorphismor inheritance

谢谢!

4

2 回答 2

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);
    }
}
于 2012-12-31T03:38:53.557 回答
2

你有不一致的命名方法。您的基类有updateView,但您的派生类有updateWebView此外,由于您还没有使用任何基类方法,这将属于多态性,这意味着您可以根据需要使用接口。

于 2012-12-31T03:40:00.910 回答