Контракт интерфейса, объект класса? - PullRequest
20 голосов
/ 20 октября 2008

Контракт к интерфейсу как объект к классу?

Зачем нужно различать подобные вещи от кода до исполняемого кода? Я как бы получил идею назвать класс классом, а экземпляр исполняемого класса - объектом, но в целом, единственная ли причина для этих полу-избыточных терминов?

Ответы [ 6 ]

33 голосов
/ 20 октября 2008

Не совсем. Здесь четыре термина, поэтому я перейду к каждому из них:

Интерфейс

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

Договор

Контракт - это неявное соглашение, которое вы заключаете между пользователями и разработчиками класса или интерфейса. Например, предусловия и постусловия (инварианты, как правило, являются контрактом внутри реализации класса - как правило, такие вещи, как отношения между внутренними членами, не нужно раскрывать). Спецификация для возвращаемого значения или аргумента также может быть частью контракта. Он в основном представляет, как использовать функцию / класс / интерфейс, и, как правило, не полностью представлен на любом языке (некоторые языки, такие как Eiffel, позволяют заключать явные контракты, но даже они не всегда полностью соответствуют требованиям ). Когда вы реализуете интерфейс или наследуете класс, вы всегда должны соответствовать требованиям интерфейса или, при переопределении неабстрактного класса, вести себя достаточно схожим образом, чтобы внешний зритель не заметил разницы (это Лисков Принцип замещения: производный объект должен быть способен заменить основание без каких-либо различий в поведении с внешней точки зрения).

Класс * * +1011 Классу не нужно много ходить, так как вы явно использовали его раньше. Класс - это тип данных, а в некоторых языках это расширенный набор интерфейсов (которые не имеют формального определения, как в C ++), а в других он независим (например, в Java). Object

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

7 голосов
/ 20 октября 2008

Нет, не совсем. Класс - это шаблон, который вы определяете. Каждый объект, который создает этот класс, следует шаблону. Они не являются избыточными терминами, потому что эти две вещи не идентичны. Вы можете представить класс как определенный пользователем тип данных. Классы и объекты отличаются друг от друга точно так же, как примитивный тип данных int отличается от литерального значения 3.

Интерфейс определяет набор методов, которые должны поддерживать все реализующие классы. Сам интерфейс - это контракт, который вы определяете для классов реализации. Это просто говорит о том, что любой класс, который реализует интерфейс, должен иметь набор открытых методов этого интерфейса.

1 голос
/ 20 октября 2008

Чтобы завершить предыдущие ответы, пару слов об интерфейсах:

Если класс является чем-то большим, чем шаблон для объекта (поскольку его глобальные характеристики не зависят от каких-либо экземпляров), интерфейс также можно описать как точка зрения

Класс, реализующий несколько интерфейсов:

  • завершить контракт, который необходимо соблюдать
  • позволяет пользователю видеть любые экземпляры этого класса с точки зрения класса, представленного реализованным интерфейсом.

«Точка зрения» означает, что вы можете использовать объект, сосредоточившись исключительно на контракте, определяемом этим интерфейсом.

Именно в этом аспекте интерфейс является «абстрактным классом», как в «абстракции» (то, что соответствует некоторым характеристикам класса, но не учитывает некоторые другие). В Java-интерфейсе интерфейс фактически отсутствует, поскольку его можно применять только для определения контракта, например, а не для статических методов или функций.

1 голос
/ 20 октября 2008

На самом деле интерфейс - это контракт, когда объект является экземпляром класса - это разные вещи, которые не имеют много общего.

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

Например, у вас может быть два класса, реализующих один и тот же интерфейс / контракт, но выполняющих совершенно разные вещи (даже если смысл их выполнения может быть одинаковым).

Возьмем, к примеру, интерфейс IDisposable: каждый объект может освобождать ресурсы, которые он использует, но он может делать это разными способами, он может не выпускать ничего. Это выбор объекта.

По крайней мере, это будет POV в .NET

1 голос
/ 20 октября 2008

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

Терминология менее важна, чем применение.

0 голосов
/ 20 октября 2008

«Класс» и «Объект» представляют две разные вещи; они связаны, но то, что они представляют, отличается, довольно сильно.

Лучший способ описать это - посмотреть на Static. Класс может иметь статические члены, которые полностью отделены от любого INSTANCE этого класса. Объекты этого класса могут использовать или не использовать эти статические члены; но экземпляр объекта этого класса полностью отделен от любого статического использования этого класса (или должно быть, по крайней мере).

Или подумайте о единственном образце. Хранение экземпляра объекта класса в статическом методе доступа к классам является обычной практикой и показывает разницу. Вы обращаетесь к статическому средству доступа класса , чтобы получить экземпляр объекта одноэлементного класса; если статический член класса не имеет экземпляра объекта для ссылки, класс создает экземпляр объекта .

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

...