Непрозрачные типы

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

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

Базовая Основа имеет много непрозрачных типов, и имена этих типов отражают свои надлежащие использования. Например, CFString является непрозрачным типом, «представляющим» и воздействующим на массивы символа Unicode. («CF» является, конечно, префиксом для Базовой Основы.) CFArray является непрозрачным типом для индексируемой функциональности набора. Функции, константы и другие вторичные типы данных в поддержку непрозрачного типа обычно определяются в заголовочном файле, имеющем имя типа; CFArray.h, например, содержит определения символа для типа CFArray.

Рисунок 1  непрозрачный тип
An opaque type

Преимущества непрозрачных типов

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

Непрозрачные типы обеспечивают лучшую абстракцию и больше гибкости для того, как реализована базовая функциональность. Путем сокрытия подробных данных, таких как поля структур, Базовая Основа сокращает шанс для ошибок, которые могли бы произойти в клиентском коде, когда изменяются те подробные данные. Кроме того, непрозрачные типы разрешают оптимизацию, которая могла бы сбить с толку, если представлено. Например, CFString «официально» представляет массив 16-разрядных символов типа UniChar. Однако CFString мог бы принять решение сохранить диапазон символов в диапазоне ASCII как 8-разрядные значения. Копирование неизменного объекта могло бы (и обычно делает), результат в совместно используемой ссылке на объект вместо двух отдельных объектов в памяти (см. Руководство по программированию управления памятью для Базовой Основы).

Продолжая пример CFString, это могло бы казаться тяжеловесом для использования непрозрачного типа для хранения символов. Как это оказывается, однако, стоимость CPU такого хранения не намного выше, чем использование простого массива C символов и стоимости памяти часто меньше. Кроме того, непрозрачность не обязательно означает, что непрозрачный тип никогда не может обеспечивать механизмы для доступа к содержанию непосредственно. CFString, например, обеспечивает CFStringGetCStringPtr функция с этой целью.

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