Вопрос

Относится ли контракт к интерфейсу так же, как объект к классу?

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

Это было полезно?

Решение

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

Интерфейс

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

Contract

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

Класс

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

Объект

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top