Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 确保在每次调用B(抽象实现的方法)之后调用方法A?_Java - Fatal编程技术网

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

Java 确保在每次调用B(抽象实现的方法)之后调用方法A?,java,Java,上这个有品位的课 public abstract class CakeSkill { //.. boolean cherry=false; private void finalMandatoryTouch() { cherry=true; } abstract public void

上这个有品位的课

     public abstract class CakeSkill 
     {

         //.. 

         boolean cherry=false;

         private void finalMandatoryTouch()
         {        
              cherry=true;
         }                
         abstract public void cook();
     }
一个扩展它的类类似于

     class Cheff extends CakeSkill 
     {
         //..

         void cook()
         {
         //..Secret recipe
         }     
     }
但这当然行不通

FinalMandaryTouch()尚未调用,则没有蛋糕会以樱桃结尾。

[编辑]

这可能是一个解决方案

       class MemoriousCheff extends CakeSkill 
       {
           //..

           void cook()
           {
               //..Secret recipe
               finalMandatoryTouch();
           }     
       }
但需要:

  • 切夫有一个完美的记忆,不要忘记调用finalMandatoryTouch()
  • 使finalMandatoryTouch()受到保护(至少)
[/EDIT]

那太好了!(但没有Java)如果能做到这一点

  abstract public void cook()   
  {  
    @implementedMethod

    finalMandatoryTouch();        
  }
如何实现这个有用的功能


非常感谢

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

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

protected abstract void cookImpl();
这样子类只需要担心
cookImpl
,但是
cook
的调用方就可以得到最重要的信息。不在同一包或类层次结构中的调用方甚至看不到
cookImpl
,因此无法直接调用它

基本上,这就是问题所在

public abstract class CakeSkill {

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

    protected abstract doCook();

    private finalMandatoryTouch() { ... }
}

等等。

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

在您的
摘要
课程中:

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

 abstract void specificCook();

它被称为模板方法模式

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

abstract public void mainCookRecipe();

似乎继承不是为问题建模的正确方法。在Java中,您只能从一个类继承,而且由于它也是一个非常静态的关系,这限制了您的厨师的技能

更好的方法是使用构图。厨师的烹饪技能可能是:

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();
    // ...
  }
}

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

Oops-您的意思是
abstract void specificCook()