Написать функцию абстракции и представление инварианта - PullRequest
0 голосов
/ 07 сентября 2018

Я знаю, что такое функция абстракции и инвариант представления, но мне сложно писать их самостоятельно. Функция абстракции: Функция от конкретного представления объекта до абстрактного значения, которое оно представляет. Инвариант представления: Условие, которое должно быть истинным для всех допустимых конкретных представлений класса. Например:

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 голосов
/ 07 сентября 2018

Таким образом вы заставляете разработчик классов, расширяющих абстрактный 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...