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

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

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

Теперь я вижу разницу, спасибо за ответы. Я использовал их в течение многих лет, хотя и хорошо и точно, исходя из того, что я видел, но я никогда не останавливался, чтобы действительно продумать определения.

Adron 20.10.2008 23:23
Сила классов Java: сравнение с языком C
Сила классов Java: сравнение с языком C
Абстракция" - это процесс упрощения сложных сущностей или концепций реального мира с целью их применения в форме программирования. В Java класс...
20
1
18 291
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

Однако терминология менее важна, чем применение.

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

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

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

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

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

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

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

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

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

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

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

Ответ принят как подходящий

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

Интерфейс

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

Договор

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

Класс

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

Объект

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

Не уверен в других языках, но в C# interface и abstract class похожи, но это разные концепции; они не совпадают и не всегда могут использоваться как взаимозаменяемые.

iliketocode 07.07.2018 09:45

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

IARI 18.04.2019 13:56

См., Например, этот пост cseducators: cseducators.stackexchange.com/questions/544/…

IARI 18.04.2019 14:09

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

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

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

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

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

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

Другие вопросы по теме