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; };