Интерфейсы и реализации интерфейса

COM делает основное различие между определениями интерфейсов и их реализацией.

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

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

Например, гипотетический интерфейс с именем IStack может определять два метода с именем Push и Pop, указывая, что последовательные вызовы возвращаемого метода Pop в обратном порядке значения, ранее переданные методу Push. Это определение интерфейса не указывает, как функции должны быть реализованы в коде. При реализации интерфейса один программист может реализовать стек в виде массива и реализовать методы Push и Pop таким образом, чтобы получить доступ к такому массиву, а другой программист может использовать связанный список и реализовать методы соответствующим образом. Независимо от конкретной реализации методов Push и Pop, представление указателя в памяти на интерфейс IStack и, следовательно, его использование клиентом, полностью определяется определением интерфейса.

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

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

COM-объекты и интерфейсы