Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
#include <iostream>
#include <cassert>
class Human {
public:
Human() { setTemperature(36); }
// функция-гетер
virtual int getTemperature() const {
return temperature;
}
// функция-сетер
virtual void setTemperature(int N) {
// preconditions
int old_temperature = getTemperature();
// возможный диапазон значений температуры для человека
assert(N >= 36 && N < 45);
temperature = N;
// postconditions
assert(getTemperature() == N);
// гарантируем, что температура человека будет лежать в этих пределах
assert(getTemperature() >= 36 && getTemperature() < 45);
}
virtual void heat(int N) {
// preconditions
int old_temperature = getTemperature();
// N должно быть такое, чтобы человек не перегрелся
assert(getTemperature() + N < 45);
std::cout << "Выпил водки";
setTemperature(getTemperature() + N);
// postconditions
assert(getTemperature() == old_temperature + N);
// гарантируем, что температура человека находится в допустимых пределах
assert(getTemperature() >= 36 && getTemperature() < 45);
}
protected:
int temperature;
};
//-----------------------------------------------------------------------------
class Fireplace : public Human {
public:
// средняя температура камина без дров (т.е. кирпича внутри него) 18 градусов
Fireplace() { setTemperature(18); }
// функция-сетер
virtual void setTemperature(int N) {
// preconditions
int old_temperature = getTemperature();
// возможный диапазон значений температуры для человека был такой:
// assert(N >= 36 && N < 45);
//новый assert для камина примет вид:
assert(N > 0 && N < 800);
temperature = N;
// postconditions
assert(getTemperature() == N);
// для человека было такое постусловие:
// assert(getTemperature() >= 36 && getTemperature() < 45);
// но для камина у нас должно быть другое:
// assert(getTemperature() > 0 && getTemperature() < 800);
// однако мы не имеем право его использовать, т.к.
// getTemperature() > 0 - ОСЛАБЛЯЕТ постусловие базового класса
// следовательно, или необходимо изменить постусловие базового класса
// или, на данный момент, класс Fireplace не может быть подтипом Human
}
// подогреть на N градусов
virtual void heat(int N) {
// preconditions
int old_temperature = getTemperature();
// кирпич в камине выдерживает максимум 800 градусов Цельсия
assert(getTemperature() + N < 800);
std::cout << "Подбросали дровишек";
setTemperature(getTemperature() + N);
// postconditions
// новая температура должна быть равна старой + N
assert(getTemperature() == old_temperature + N);
}
};
int main()
{
Human *h = new Fireplace;
h->heat(500);
return 0;
}
* This source code was highlighted with Source Code Highlighter.
[C++]Проектирование по контракту и принцип LSP на примере «Почему класс Человек не может быть подтипом класса Камин»