class account {
public:
account() { _balance = 0; promise(account::invariant()); }
virtual float balance() const { return _balance; }
void deposit(float x) {
require( x >= 0 ); check precondition
hold(); to save the old state
_balance += x;
promise( balance() == old_balance + x && invariant() );
}
void withdraw(float x) {
require( x <= balance() ); check precondition
hold(); to save the old state
_balance -= x;
promise( balance() == old_balance - x && invariant() );
}
protected:
virtual bool invariant() { return balance() >= 0; }
virtual void hold() { old_balance = balance(); }
private:
float _balance;
float old_balance; additional variable
};
A credit_account may be considered to be an improvement over an ordinary account since it allows us to draw more money from it. One possible realization is given below.
class credit_account : public account {
public:
credit_account(float x) { _maxcredit = x; _credit = 0; }
float balance() { return _balance + _credit; }
float credit(float x) {
require( x >= 0 && x + _credit <= _maxcredit );
hold();
_credit += x;
promise( _credit = old_credit + x );
promise( balance() == old_balance + x && invariant() );
}
protected:
bool invariant() {
return _credit <= _maxcredit && account::invariant();
}
void hold() { old_credit = _credit; account::hold(); }
private:
float _maxcredit, _credit;
float old_credit;
};