В Проектировании по контракту вы указываете набор предварительных условий и набор постусловий для функции. Например, допустим, вы писали функцию выделения памяти. Требуется, чтобы он принимал положительное целое число в качестве входных данных и вырабатывал равномерно выровненный указатель в качестве результата.
Ослабление предусловия означает, что при создании производного класса он должен принимать любые входные данные, которые может принять базовый класс, но может принимать и другие входные данные. Используя приведенный выше пример, производный класс может быть написан так, чтобы принимать неотрицательное целое число вместо просто положительных целых.
На стороне результата вы должны убедиться, что результат от производной функции соответствует всем требованиям, предъявляемым к базовой функции, но он также может добавить больше ограничений. Например, производная версия функции, приведенной выше, может принять решение о выдаче только результатов, кратных 8. Каждое значение, кратное 8, является четным, поэтому оно все еще соответствует требованию базовой функции, но также наложило дополнительное ограничение.
Обратное не будет работать: если функция базового класса допускает неотрицательные целые числа в качестве входных данных, то производный класс должен продолжать принимать все неотрицательные целые числа в качестве входных данных. Попытка изменить его так, чтобы он принимал только положительные целые числа (то есть отклонить 0, что разрешено базовым классом), не будет разрешена - ваш производный класс больше не сможет заменить базовую версию при любых обстоятельствах.
Аналогично с результатами: если базовый класс наложил на результат требование «кратно 8», производная версия должна также обеспечить, чтобы все результаты были кратны 8. Возвращение 2 или 4 нарушило бы это требование.