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()受到保护(至少)
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()代码>