有这个有品位的课程
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();
}
}
但要求:
[/ EDIT]
太棒了! (但没有Java)如果可以做到这样的事情
abstract public void cook()
{
@implementedMethod
finalMandatoryTouch();
}
如何实现这个有用的功能?
非常感谢
答案 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();
// ...
}
}
现在您可以为您的厨师分配不同的烹饪技巧。