1

我已经实现了模板方法,我遇到了这种情况:

public class ProductTemplate() {    
        protected Item getItemFromShop(){
        processItemPrice();
        callOrderSummary();

    }

    protected void processItemPrice() {
        Do some logic....
    }

    protected void callOrderSummary() 
        Do some logic....
    }

}

public class ImportedProduct extends ProductTemplate() {

    @Override
    protected Item getItemFromShop() {
        super.getItemFromShop(); // When i call this super method, they will use the processItemPrice() from the implementation
    }

    @Override
    protected void processItemPrice() {
        Do another logic....
    }
}

我的疑问是..可以调用一个超级方法,如果在这个超级方法中有一个方法调用并且我重写了这个方法,那么这个类将使用什么方法实现?

解决方案:好的,它工作正常。但是当我有一个类调用一个方法被覆盖时,有这个没用:

public class SimpleProduct extends ProductTemplate(){
    public processItemPrice(){
        super.processItemPrice()
    }

}

This ProductTemplate implements an interface, and is used within Strategy pattern.. is it right?
4

1 回答 1

2

理解这类事情的最简单方法是将调试打印编码到您的代码中,看看会发生什么。

清理您的代码(以便编译)并添加一些打印:

public class ProductTemplate {
    protected Item getItemFromShop() {
        processItemPrice();
        callOrderSummary();
        return null;
    }

    protected void processItemPrice() {
//        Do some logic....
        System.out.println("ProductTemplate.processItemPrice()");
    }

    protected void callOrderSummary() {
//        Do some logic....
        System.out.println("ProductTemplate.callOrderSummary()");
    }

}

public class ImportedProduct extends ProductTemplate {

    @Override
    protected Item getItemFromShop() {
        return super.getItemFromShop(); // When i call this super method, they will use the processItemPrice() from the implementation
    }

    @Override
    protected void processItemPrice() {
//        Do another logic....
        System.out.println("ImportedProduct.processItemPrice()");
    }

    public static void main(String[] args) {
        new ImportedProduct().getItemFromShop();
    }
}

如果你运行这个ImportedProduct类(这现在是可能的,因为我添加了一个main方法),你会得到输出:

ImportedProduct.processItemPrice()
ProductTemplate.callOrderSummary()

表明确实调用了子类中的重写方法。

注意:没有必要getItemFromShop像你一样重写该方法。它与被覆盖的方法没有什么不同。

于 2015-03-06T01:06:32.127 回答