Что означает «контракт» класса - PullRequest
28 голосов
/ 16 декабря 2011

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

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

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

Ответы [ 8 ]

33 голосов
/ 16 декабря 2011

Контракт в классе Java аналогичен контракту в реальном мире. В нетехнических терминах:

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

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

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

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

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

5 голосов
/ 16 декабря 2011

Контракт типа (class, interface, enum) - это, ну, контракт , который этот тип обещает соблюдать. В нем говорится:

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

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

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

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

3 голосов
/ 16 декабря 2011

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

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

2 голосов
/ 16 декабря 2011

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

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

0 голосов
/ 16 декабря 2011

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

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

0 голосов
/ 16 декабря 2011

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

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

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

0 голосов
/ 16 декабря 2011

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

0 голосов
/ 16 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...