确保在每次调用B(抽象实现的方法)后调用方法A?

时间:2011-07-06 21:39:32

标签: java

有这个有品位的课程

     public abstract class CakeSkill 
     {

         //.. 

         boolean cherry=false;

         private void finalMandatoryTouch()
         {        
              cherry=true;
         }                
         abstract public void cook();
     }

扩展它的类就像

     class Cheff extends CakeSkill 
     {
         //..

         void cook()
         {
         //..Secret recipe
         }     
     }

但当然这不起作用,

finalMandaroryTouch()尚未被调用,然后没有蛋糕将以樱桃结束..

[编辑]

这个可能是一个解决方案

       class MemoriousCheff extends CakeSkill 
       {
           //..

           void cook()
           {
               //..Secret recipe
               finalMandatoryTouch();
           }     
       }

要求:

  • Cheff有一个完美的记忆,不要忘记调用finalMandatoryTouch()
  • 使finalMandatoryTouch()受到保护(至少)

[/ EDIT]

太棒了! (但没有Java)如果可以做到这样的事情

  abstract public void cook()   
  {  
    @implementedMethod

    finalMandatoryTouch();        
  }

如何实现这个有用的功能?

非常感谢

5 个答案:

答案 0 :(得分:10)

cook更改为受保护的方法cookImpl,然后使用名为cook的公共最终方法:

public final void cook()
{
    cookImpl();
    finalMandatoryTouch();
}

protected abstract void cookImpl();

通过这种方式,子类只需要担心cookImpl,但cook的调用者可以获得最高分。不在同一个包或类层次结构中的呼叫者甚至看不到cookImpl,因此无法直接调用它。

这基本上是template method pattern

答案 1 :(得分:3)

它被称为模板方法模式。

final public void cook() {  
    mainCookRecipe();
    finalMandatoryTouch();        
}

abstract public void mainCookRecipe();

答案 2 :(得分:1)

public abstract class CakeSkill {

    public void cook() {
        doCook();
        finalMandatoryTouch();
    }

    protected abstract doCook();

    private finalMandatoryTouch() { ... }
}

答案 3 :(得分:1)

您可以将cook()方法更改为实际方法,然后调用单独的abstract方法以及finalMandatoryTouch()方法。

abstract课程中:

 public void cook() {
     specificCook();
     finalMandatoryTouch();
 }

 abstract void specificCook();

答案 4 :(得分:1)

似乎继承不是建模问题的正确方法。在Java中,你只能从一个类继承,因为它也是一个非常静态的关系,它限制了你的厨师可以执行的技能。

更好的方法是使用构图。烹饪技巧可以是厨师执行的strategies

interface CookingSkill {
  void cook();
}

class CakeSkill implements CookingSkill {
  private boolean cherry = false;
  private void finalMandatoryTouch() {
    cherry = true;
  }
  public void cook() {
    //...
    finalMandatoryTouch();
  }
}

class Chef {
  private CookingSkill cookingSkill;
  // getters and setters ...
  public void cook() {
    // ...
    cookingSkill.cook();
    // ...
  }
}

现在您可以为您的厨师分配不同的烹饪技巧。