Подтвердить что ты не робот

Что означает "контракт" класса

Я читаю книгу Язык программирования Java. В главе, в которой объясняется метод переопределения, он говорит:

Создание метода переопределения (в подклассе), менее доступного, чем в суперклассе, нарушало бы контракт суперкласса...

Текст в целом понятен. Мой единственный вопрос - что такое контракт суперкласса? Что означает контракт для класса Java?

4b9b3361

Ответ 1

Контракт в классе Java похож на контракт в реальном мире - в нетехнических терминах:

Это соглашение о том, что класс будет выставлять определенные методы, определенные свойства и определенные типы поведения.

Более технический, от здесь: (выделено жирным шрифтом)

Было бы неплохо, если бы все используемые вами классы Java, включая ваши собственный, жили до их promises? На самом деле, было бы неплохо, если бы вы действительно знал точно, что такое класс promises? Если вы согласны, прочитайте на [...]

Дизайн по контракту

Технология разработки программного обеспечения по контракту (DBC) обеспечивает высококачественное программное обеспечение, гарантируя, что каждый компонент системы оправдывает свои ожидания. Как разработчик, использующий DBC, вы указываете компонентные контракты как часть интерфейса компонента. Контракт определяет, какой компонент ожидает клиентов и какие клиенты могут ожидайте этого.

Ответ 2

Контракт типа (класс, интерфейс, перечисление) - это, ну, контракт этого типа promises для соответствия. В нем указано:

  • какие приемлемые параметры для конструктора и/или методов этого типа;
  • что вы должны и/или не должны ожидать, что этот тип будет делать. Например, он может заявить, что вы должны ожидать, что этот класс будет потокобезопасным или не потокобезопасным;
  • что такое инварианты, поддерживаемые этим типом. Например, введите метод addData(float) класса MathAverage, который вычисляет среднее значение его ввода, может указывать на то, что каждый раз, когда ваш вызов add(float) возвращается, вы должны ожидать, чтобы вызов MathAverage.getAverage() возвращал правильное среднее текущего ввода.
  • вообще говоря, ваш тип может указывать любое ограничение, за которым должны следовать все подтипы. Например, он может сказать: "ни один метод этого типа не должен занимать больше 1 секунды для выполнения".

Контракт указан в произвольной форме в javadoc типа. Существуют некоторые инструменты/практики для обеспечения исполнения контрактов, но они ограничены, именно потому, что контракт может быть произвольным или, даже, противоречивым, в случае ошибки программиста.

Так как подтипирование (подклассификация) может произвольно распространять/изменять поведение методов супертипа, оно также может нарушать некоторые части контракта супертипа. Примером этого может быть расширение HashMap, которое принимает значения null и ключи, с некоторой реализацией, которая запрещает значения null в вызовах к ним.

Другим важным аспектом контракта типа является то, что подтип может иметь более сильный контракт (охватывающий подмножество ограничений в контракте типа), но не может иметь более слабый контракт (охватывающий надмножество ограничений в контракте типа). Например, если ваш метод типа "doX (n)" promises принимает O(n) (линейное) время, "doX (n)" в подтипе может принимать O(1) (постоянное) время, но не может принимать O(n^2) время.

Ответ 3

Класс "Контракт" - это публичный интерфейс или, по крайней мере, интерфейс, если он представляет классы, отличные от самого себя.

Это означает, что он включает в себя любые элементы (методы, поля, конструкторы и т.д.), которые могут использовать другие классы.

Ответ 4

Это означает, что метод, переопределяющий метод родительского класса или интерфейса, должен вести себя так, как определяет контракт.

В противном случае результат undefined.

Ответ 5

Существует множество принципов, которые вы должны соблюдать при программировании в Java или на любых языках программирования. Принципы зависят от языка программирования, который вы используете. Вы можете узнать больше о контракте в Дизайн по странице wikipedia по контракту

Ответ 6

в простых терминах это означает, что вы нарушите условия суперкласса, если вы сделаете код переопределения менее доступным

Ответ 7

Это выражение, которое исходит из идеи контрактов в "реальном мире".

В принципе, если вы нарушаете свой контракт с классом, то он не должен вести себя так, как вы могли ожидать. С другой стороны, это обещание класса, что, если вы будете следовать правилам, изложенным в нем, он будет вести себя так, как говорит его API.

Один общий пример контракта в Java переопределяет equals(), когда hashCode() переопределяется. Два объекта, которые считаются равными, должны по контракту иметь один и тот же хэш-код. Возможно написать код, который синтаксически исправляет то, что не подчиняется этому, но он может не работать должным образом и что ошибка программиста, нарушившего контракт.

Ответ 8

Договор класса или интерфейса на Java или любом другом языке OO обычно ссылается на публично выставленные методы (или функции) и свойства (или поля или атрибуты) этого интерфейса класса вместе с любые комментарии или документы, относящиеся к этим общедоступным методам и свойствам.

В случае отношения между классом и подклассом любые защищенные методы или свойства будут считаться "публично открытыми" в том смысле, что они подвержены подклассу.