编写抽象函数和表示形式不变

时间:2018-09-07 08:57:34

标签: java abstraction contract

我知道什么是抽象函数和表示不变式,但是我很难自己编写它们。 抽象函数:从对象的具体表示到其表示的抽象值的函数。 表示形式不变:对于一个类的所有有效具体表示形式,必须为真的条件。 例如:

class Appointment{
    /**
     * AF: 
     * IR: 
     */
    private Time time;
    private Intervention intervention;
    private Room room;


    /** EFFECT initializes to null an appointment
     *  @param time REQUIRE != null
     *  @param intervention  REQUIRE != null
     *  @param room REQUIRE != null
     */
    public Appointment(Time time, Intervention intervention, Room room){
        time = null;
        intervention = null;
        room = null;
    }}

我的问题是:怎么写?

谢谢。

1 个答案:

答案 0 :(得分:0)

这样,您可以强制扩展抽象A的类的实现者定义其自己的不变式。

abstract class A {
   public void doSth(){
       Invariant invariant = getInvariant();
       check(invariant);
       //do some work
       check(invariant);
   }

   //define your invariant in concrete impl
   protected abstract Invariant getInvariant();
}

我再次重新阅读了您的问题,但我仍然不确定。 还是要在抽象类中定义不变式并在具体实现中进行检查?

abstract class A {
   private void checkInvariant(){
       //check state
       //if state is breaking invariant throw exception
   }

   public void doSth() {
        checkInvariant();
        doActualWork();
        checkInvariant();
   }

   protected abstract void doActualWork();
}