模板方法调用 super 并使用实现

Template Method calling super and use implementation

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

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....
    }
}

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

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

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

}

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

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

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

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 class(现在可以,因为我添加了 main 方法),你将得到输出:

ImportedProduct.processItemPrice()
ProductTemplate.callOrderSummary()

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

注意:不需要像您那样重写 getItemFromShop 方法。它与覆盖的方法没有什么不同。