确保方法被调用

时间:2009-04-01 17:52:00

标签: java inheritance

我有这堂课:

public abstract class AbstractIncomingCall {

    /*
    class properties
    */

    public void changeStatus(/*some parameters*/){
        //store parameters in class properties
        isValid();
    }

    protected abstract boolean isValid();
}

...由本课程扩展:

public class IncomingCallImpl extends AbstractIncomingCall{

    //I override the parent's method
    public void changeStatus(/*same parameters as parent's method*/) {
        super.changeStatus(/*same parameters as parent's method*/);
        //do something interesting 
    }

    protected boolean isValid() throws StatusChangeNotOccurredException {
        //implement my validation algorithm
    }

我想要实现的是确保每当调用changeStatus(/ * some parameters * /)时调用isValid()方法;请注意,isValid()方法仅在具体类中实现,它还使用从父类继承的类属性。 我有没有办法确保调用isValid()而不是调用super? 我非常不喜欢我必须传递参数的事实,我认为我完全走错了方向并且有一种更清洁的方法来实现这一点。 我想在我的代码中保留的是抽象类中的“isValid()调用逻辑”,因为每个调用都需要进行验证,我不能依赖于我将来记住这个:P

提前致谢:]

4 个答案:

答案 0 :(得分:14)

听起来您希望changeStatus()遵循模板方法模式。在这种模式中,您在抽象类中定义changeStatus()(如果您不信任人们正确扩展,则将其设置为final),并让它调用所需的方法:

public final void changeStatus()
{
    doSomethingSubclassSpecific();
    isValid()
}


protected abstract doSomethingSubclassSpecific();

答案 1 :(得分:2)

您无需覆盖changeStatus()。您非常接近实现Template Method设计模式。

答案 2 :(得分:2)

您可以将changeStatus设为final,并向其添加对可以覆盖的customChangeStatus方法的调用。 如下所示:

公共抽象类AbstractIncomingCall {

/*
class properties
*/

public final void changeStatus(/*some parameters*/){
    //store parameters in class properties
    isValid();
    customChangeStatus();
}

protected abstract void customChangeStatus();
protected abstract boolean isValid();

}

您甚至可以为customChangeStatus实现一个空方法,因此您不需要始终实现它。 使用changeStatus中的final,您确信在调用类时这将是逻辑。您仍然可以灵活地为其添加自定义行为。

答案 3 :(得分:0)

我建议使用合成而不是继承。事情应该变得更加明显。