Использование Dynamic Link с After Effects
Руководство пользователя Отмена
Поиск
- Руководство пользователя After Effects
- Бета-версии
- Обзор программы бета-тестирования
- Домашняя бета-версия After Effects
- Функции в бета-версии
- Панель свойств (бета-версия)
- Диспетчер эффектов (бета-версия)
- Запуск и восстановление в настройках (бета-версия)
- Импорт 3D-моделей (бета-версия)
- Начало работы
- Начало работы с After Effects
- Что нового в After Effects
- Примечания к выпуску | После Эффекты
- Системные требования After Effects
- Сочетания клавиш в After Effects
- Поддерживаемые форматы файлов | После Эффекты
- Рекомендации по оборудованию
- After Effects для Apple Silicon
- Планирование и настройка
- Рабочие области
- Общие элементы пользовательского интерфейса
- Знакомство с интерфейсом After Effects
- Рабочие процессы
- Рабочие пространства, панели и средства просмотра
- Проекты и композиции
- Проекты
- Основы композиции
- Предварительная компоновка, вложение и предварительный рендеринг
- Просмотр подробной информации о производительности с помощью Composition Profiler
- Средство визуализации композиции CINEMA 4D
- Импорт отснятого материала
- Подготовка и импорт неподвижных изображений
- Импорт из After Effects и Adobe Premiere Pro
- Импорт и интерпретация видео и аудио
- Подготовка и импорт файлов 3D-изображений
- Импорт и интерпретация элементов видеоряда
- Работа с элементами видеоряда
- Обнаружение точек редактирования с помощью обнаружения редактирования сцены
- Метаданные XMP
- Текст и графика
- Текст
- Форматирование символов и панель символов
- Текстовые эффекты
- Создание и редактирование текстовых слоев
- Форматирование абзацев и панели «Абзац»
- Выдавливание текстовых и фигурных слоев
- Анимированный текст
- Примеры и ресурсы для текстовой анимации
- Живые текстовые шаблоны
- Анимационная графика
- Работа с шаблонами анимационного дизайна в After Effects
- Использование выражений для создания раскрывающихся списков в шаблонах анимационного дизайна
- Работа с основными свойствами для создания шаблонов анимационного дизайна
- Замена изображений и видео в шаблонах анимационного дизайна и основных свойствах
- Текст
- Рисование, рисование и контуры
- Обзор слоев фигур, контуров и векторной графики
- Инструменты рисования: Кисть, Штамп и Ластик
- Штрихи в форме конуса
- Атрибуты фигуры, операции рисования и операции пути для слоев формы
- Используйте эффект формы Offset Paths для изменения формы
- Создание фигур
- Создание масок
- Удаляйте объекты из видео с помощью панели «Заливка с учетом содержимого»
- Кисть для ротоскопии и Refine Matte
- Слои, маркеры и камера
- Выбор и размещение слоев
- Режимы наложения и стили слоя
- 3D-слои
- Свойства слоя
- Создание слоев
- Управление слоями
- Маркеры слоев и маркеры композиции
- Камеры, источники света и достопримечательности
- Анимация, ключевые кадры, отслеживание движения и кеинг
- Анимация
- Основы анимации
- Анимация с помощью инструментов Puppet
- Управление и анимация контуров и масок фигур
- Анимация фигур Sketch и Capture с помощью After Effects
- Различные инструменты для анимации
- Работа с управляемой данными анимацией
- Ключевой кадр
- Интерполяция ключевого кадра
- Установка, выбор и удаление ключевых кадров
- Редактирование, перемещение и копирование ключевых кадров
- Отслеживание движения
- Отслеживание и стабилизация движения
- Отслеживание лица
- Отслеживание маски
- Артикул маски
- Скорость
- Растяжение времени и перераспределение времени
- Временной код и единицы отображения времени
- Ключ
- Ключ
- Ключевые эффекты
- Анимация
- Прозрачность и композитинг
- Обзор компоновки и прозрачности и ресурсы
- Альфа-каналы и маски
- Коврики для дорожек и коврики для путешествий
- Настройка цвета
- Основы цвета
- Управление цветом
- Эффекты цветокоррекции
- Управление цветом OpenColorIO и ACES
- Предустановки эффектов и анимации
- Обзор предустановок эффектов и анимации
- Список эффектов
- Эффекты моделирования
- Эффекты стилизации
- Звуковые эффекты
- Эффекты искажения
- Перспективные эффекты
- Канальные эффекты
- Создание эффектов
- Эффекты перехода
- Эффект ремонта рольставней
- Эффекты размытия и резкости
- Эффекты 3D-канала
- Вспомогательные эффекты
- Матовые эффекты
- Эффекты шума и зернистости
- Эффект Upscale с сохранением деталей
- Устаревшие эффекты
- Выражения и автоматизация
- Выражения
- Основы выражений
- Понимание языка выражений
- Использование элементов управления выражением
- Различия в синтаксисе между модулями выражений JavaScript и Legacy ExtendScript
- Редактирование выражений
- Ошибки выражения
- Использование редактора выражений
- Использование выражений для редактирования и доступа к свойствам текста
- Ссылка на язык выражений
- Примеры выражений
- Автоматика
- Автоматика
- Скрипты
- Выражения
- Иммерсивное видео, виртуальная реальность и 3D
- Создание сред виртуальной реальности в After Effects
- Применение иммерсивных видеоэффектов
- Инструменты для композитинга видео VR/360
- Отслеживание движения 3D-камеры
- Работа в пространстве 3D-дизайна
- Приспособления для трехмерного преобразования
- Делайте больше с 3D-анимацией
- Предварительный просмотр изменений в 3D-проектах в режиме реального времени с помощью 3D-движка Mercury
- Добавьте адаптивный дизайн к своей графике
- Просмотры и предварительные просмотры
- Предварительный просмотр
- Предварительный просмотр видео с помощью Mercury Transmit
- Изменение и использование представлений
- Визуализация и экспорт
- Основы визуализации и экспорта
- Кодирование H. 264 в After Effects
- Экспорт проекта After Effects как проекта Adobe Premiere Pro
- Преобразование фильмов
- Многокадровый рендеринг
- Автоматический рендеринг и сетевой рендеринг
- Рендеринг и экспорт неподвижных изображений и последовательностей неподвижных изображений
- Использование кодека GoPro CineForm в After Effects
- Работа с другими приложениями
- Dynamic Link и After Effects
- Работа с After Effects и другими приложениями
- Настройки синхронизации в After Effects
- библиотек Creative Cloud в After Effects
- Плагины
- Cinema 4D и Cineware
- Совместная работа: Frame.io и Team Projects
- Совместная работа в Premiere Pro и After Effects
- Frame.io
- Установить и активировать Frame.io
- Использование Frame.io с Premiere Pro и After Effects
- Часто задаваемые вопросы
- Групповые проекты
- Начало работы с командными проектами
- Создать командный проект
- Сотрудничайте с командными проектами
- Память, хранилище, производительность
- Память и хранилище
- Как After Effects решает проблемы с нехваткой памяти при предварительном просмотре
- Повышение производительности
- Настройки
- Требования к графическому процессору и драйверу графического процессора для After Effects
- База знаний
- Известные проблемы
- Исправлены проблемы
- Как After Effects решает проблемы с нехваткой памяти при предварительном просмотре
В прошлом для совместного использования мультимедийных ресурсов между приложениями постпроизводства требовалось визуализировать и экспортировать свою работу из одного приложения, прежде чем импортировать ее в другое. Этот рабочий процесс был неэффективным и отнимал много времени. Если вы хотели изменить исходный актив, вы снова визуализировали и экспортировали актив. Несколько визуализированных и экспортированных версий ресурса занимают место на диске и могут привести к проблемам с управлением файлами.
Dynamic Link предлагает альтернативу этому рабочему процессу. Вы можете создавать динамические связи между After Effects и Adobe Premiere Pro. Создать динамическую ссылку так же просто, как импортировать любой другой тип ресурса. Динамически связанные ресурсы отображаются с уникальными значками и цветами меток, чтобы их было легче идентифицировать. Динамические ссылки сохраняются в проектах, созданных этими приложениями.
Вы можете создавать новые композиции After Effects и динамически связывать их с Adobe Premiere Pro. Вы также можете динамически связать существующие композиции After Effects из Adobe Premiere Pro.
Создание композиции из клипов в Adobe Premiere Pro
Вы можете заменить выбранные клипы в Adobe Premiere Pro динамически связанной композицией After Effects на основе этих клипов. Новая композиция наследует настройки эпизода из Adobe Premiere Pro.
Откройте Premiere Pro и выберите клипы, которые вы хотите заменить.
Щелкните правой кнопкой мыши любой из выбранных клипов.
Выберите «Заменить композицией After Effects».
After Effects открывается (если он еще не открыт) и создается новая связанная композиция.
Создание новой динамически связанной композиции из Adobe Premiere Pro запускает After Effects. Затем After Effects создает проект и композицию с размерами, соотношением сторон в пикселях, частотой кадров и частотой дискретизации звука исходного проекта. (Если After Effects уже запущен, он создает композицию в текущем проекте.) Имя новой композиции основано на имени проекта Adobe Premiere Pro, за которым следует цифра 9.0484 Связанная комп [x] .
В Adobe Premiere Pro выберите «Файл» > «Adobe Dynamic Link» > «Новая композиция After Effects». В версии Premiere Pro 2014 года вы можете импортировать композиции с помощью медиабраузера. Дополнительные сведения см. в следующих разделах Premiere Pro:
- Импорт файлов с помощью медиабраузера
- Adobe Dynamic Link
Если появится диалоговое окно After Effects «Сохранить как», введите имя и расположение проекта After Effects и нажмите «Сохранить».
При создании динамически связанной композиции After Effects продолжительность композиции устанавливается на 30 секунд. Чтобы изменить продолжительность, выберите композицию в After Effects, затем выберите «Композиция» > «Настройки композиции». Перейдите на вкладку «Основные» и укажите новое значение «Длительность».
Для достижения наилучших результатов сопоставьте параметры композиции (такие как размеры, соотношение сторон в пикселях и частоту кадров) с параметрами в Adobe Premiere Pro.
Выполните одно из следующее:
В Adobe Premiere Pro выберите «Файл» > «Adobe Dynamic Link» > «Импортировать композицию After Effects». Выберите файл проекта After Effects (.aep), а затем выберите одну или несколько композиций.
В Adobe Premiere Pro выберите файл проекта After Effects и нажмите «Открыть». Затем выберите композицию в появившемся диалоговом окне и нажмите OK.
Перетащите одну или несколько композиций с панели «Проект» After Effects на панель «Проект» Adobe Premiere Pro.
Перетащите файл проекта After Effects на панель проектов Premiere Pro. Если файл проекта After Effects содержит несколько композиций, откроется диалоговое окно «Импорт композиции».
Вы можете ссылаться на одну композицию After Effects несколько раз в одном проекте Adobe Premiere Pro.
Используйте команду «Редактировать оригинал» в Adobe Premiere Pro, чтобы изменить связанную композицию After Effects. Когда композиция открыта в After Effects, вы можете изменить композицию без повторного использования команды «Редактировать оригинал».
Выберите композицию After Effects в Adobe Premiere Pro или выберите связанный клип на временной шкале и выберите «Правка» > «Редактировать оригинал».
Измените композицию в After Effects. Затем вернитесь в Adobe Premiere Pro, чтобы просмотреть изменения.
Изменения, сделанные в After Effects, отображаются в Adobe Premiere Pro. Adobe Premiere Pro перестает использовать любые файлы предварительного просмотра, созданные для клипа до внесения изменений.
Вы может изменить название композиции в After Effects после создание динамической ссылки на него из Adobe Premiere Pro. Adobe Premiere Pro не обновляет связанный название композиции на панели «Проект». Adobe Premiere Pro однако сохраняет динамическую ссылку.
Вы можете удалить связанную композицию из проекта Adobe Premiere Pro в любое время, даже если композиция используется в проекте.
Вы можете в любое время удалить связанные клипы с временной шкалы эпизода Adobe Premiere Pro или временной шкалы.
В Adobe Premiere Pro выберите связанную композицию или клип и нажмите клавишу Delete.
Создание последовательности Adobe Premiere Pro из After Effects запускает Adobe Premiere Pro. Затем Adobe Premiere Pro создает проект и последовательность с размерами, соотношением сторон в пикселях, частотой кадров и частотой дискретизации звука исходного проекта. (Если Adobe Premiere Pro уже запущен, он создает последовательность в текущем проекте.)
В After Effects выберите «Файл» > «Adobe Dynamic Link» > «Новый эпизод Premiere Pro».
Для достижения наилучших результатов сопоставьте параметры последовательности и параметры проекта в Adobe Premiere Pro (например, размеры, соотношение сторон в пикселях и частоту кадров) с параметрами в проекте After Effects.
Выполните одно из следующих действий:
В After Effects выберите «Файл» > «Adobe Dynamic Link» > «Импорт эпизода Premiere Pro». Выберите проект Adobe Premiere Pro, а затем выберите один или несколько эпизодов.
Перетащите один или несколько эпизодов с панели «Проект» Adobe Premiere Pro на панель «Проект» After Effects.
Связанный клип может относиться к сложной исходной композиции. Действия, которые вы выполняете с исходной композицией, требуют дополнительного времени обработки в зависимости от сложности. After Effects применяет действия и делает окончательные данные доступными для Adobe Premiere Pro, используя глобальный кэш производительности и функции постоянного дискового кэша. Эти функции повышают производительность After Effects за счет использования кэшированных кадров, когда Premiere Pro запрашивает кадры.
Чтобы уменьшить задержки воспроизведения, выполните одно из следующих действий:
Переведите связанную композицию в автономный режим
Отключить связанный клип, чтобы временно прекратить ссылаться на композицию
Замените динамически связанную композицию визуализированным файлом с помощью функции «Рендеринг и замена» в Premiere Pro («Клип» > «Рендеринг и замена»).
Если вы обычно работаете со сложными исходными композициями, увеличьте объем оперативной памяти или установите более быстрый процессор.
Экспорт в Adobe Media Encoder
Для кодирования композиций After Effects необходимо добавить элемент в очередь кодирования в Adobe Media Encoder, а затем выбрать предустановки кодирования или создать собственные пользовательские настройки для рендеринга. В After Effects вы можете добавить композицию в очередь Media Encoder, используя один из следующих вариантов:
- Файл > Экспорт > Добавить в очередь Media Encoder
- Композиция > Добавить в очередь Media Encoder
Когда вы добавляете композицию или проект в очередь Adobe Media Encoder, After Effects запускает Adobe Media Encoder с композициями, перечисленными в очереди.
Процесс кодирования описан в следующих статьях:
- Кодирование с использованием пресетов
- Кодировать с использованием пользовательских настроек
Больше похоже на это
- Работа с Adobe Premiere Pro и After Effects
- Импорт из After Effects и Adobe Premiere Pro
Войдите в свою учетную запись
Войти
Управление учетной записью
Состав против наследования: что выбрать?
В начале.
..… не было ни наследования, ни композиции, только код.
И код был громоздким, повторяющимся, блочным, несчастливым, многословным и усталым.
Копирование и вставка были основными механизмами повторного использования кода. Процедуры и функции были редкостью, к новомодным гаджетам относились с подозрением. Вызов процедуры был дорогим! Отделение кусков кода от основной логики вызвало путаницу!
Темное время было.
Затем мир осветил свет объектно-ориентированного программирования (ООП)… И мир практически игнорировал его в течение нескольких десятилетий 1 . До графических пользовательских интерфейсов 2 , которые, как оказалось, очень и очень нуждаются в ООП. Когда вы нажимаете кнопку в окне, что может быть проще для создания соответствующих ответов, чем отправить этой кнопке (или ее суррогату) сообщение Click 3 ?
После этого полетел ООП. Многочисленные 4 9Было написано 0652 книги и опубликовано бесчисленное количество 5 статей. Итак, теперь все в деталях разбираются в объектно-ориентированном программировании, верно?
К сожалению, код (и Интернет) говорят нет.
Самая большая путаница и разногласия, по-видимому, связана с композицией и наследованием, часто резюмируемой в мантре «предпочитайте композицию наследованию». Давайте поговорим об этом.
Мантры считаются вредными
Как эвристика, «предпочесть композицию наследованию» — это нормально, однако я не фанат мантр. Хотя они часто содержат зерно истины, люди слишком легко слышат лозунг, не понимая его источника или контекста, и, таким образом, избегают думать самостоятельно, а это никогда не заканчивается хорошо.
Я также не являюсь поклонником нелепых кликбейтных заголовков, таких как «Наследование — это зло» 6 , особенно когда автор пытается подкрепить такое возмутительное утверждение ненадлежащим использованием наследования… а затем обвиняет его. Как плотник, заявляющий, что молотки бесполезны, потому что они плохо закручивают шурупы.
Начнем с основ.
Определения
Вот определение объектно-ориентированного программирования, которое я буду использовать в оставшейся части статьи: предположим, что у нас есть «классический» язык ООП, то есть тот, который поддерживает классы с полями, методами и одиночным наследованием. Никаких интерфейсов, никаких примесей, никаких аспектов, никакого множественного наследования, никаких делегатов, никаких замыканий, никаких лямбда-выражений, ничего, кроме основ:
- Класс: именованное понятие в доменном пространстве с необязательным суперклассом, определенным как набор полей и методов.
- Поле: именованное свойство некоторого типа, которое может ссылаться на другой объект (см. состав)
- Метод: именованная функция или процедура с параметрами или без них, реализующая некоторое поведение класса.
- Наследование: класс может наследовать — использовать по умолчанию — поля и методы своего суперкласса. Наследование является транзитивным, поэтому класс может наследовать от другого класса, который наследуется от другого класса, и так далее, вплоть до базового класса (обычно Object, возможно, неявного/отсутствующего). Подклассы могут переопределять некоторые методы и/или поля, чтобы изменить поведение по умолчанию.
- Состав: когда тип поля является классом, поле будет содержать ссылку на другой объект, тем самым создавая ассоциативное отношение между ними. Не вдаваясь в нюансы разницы между простой ассоциацией, агрегацией и композицией, давайте интуитивно определим композицию как случай, когда класс использует другой объект для обеспечения части или всей своей функциональности.
- Инкапсуляция: взаимодействуя с объектами, а не напрямую с реализацией методов и полей, мы скрываем и защищаем реализацию класса. Если потребитель ничего не знает об объекте, кроме его открытого интерфейса, он не может полагаться на какие-либо детали внутренней реализации.
Наследование является фундаментальным
Наследование является фундаментальным для объектно-ориентированного программирования. Язык программирования может иметь объекты и сообщения, но без наследования он не является объектно-ориентированным (просто «объектно-ориентированным», но все же полиморфным).
…а также Состав
Композиция также является фундаментальной для каждого языка . Даже если язык не поддерживает композицию (редкость в наши дни!), люди все еще думают в терминах частей и компонентов. Было бы невозможно разбить сложные проблемы на модульные решения без композиции.
(Инкапсуляция тоже фундаментальна, но мы не будем здесь подробно о ней говорить.)
Итак, о чем спор?
И композиция, и наследование фундаментальны, так в чем же дело?
Большое дело в том, чтобы думать, что одно может заменить другое во всех случаях, или что одно лучше или хуже другого. Как и во всем остальном в разработке программного обеспечения, здесь приходится идти на компромиссы.
Композицию довольно легко понять — мы можем видеть композицию в повседневной жизни: у стула есть ножки, стена состоит из кирпичей и раствора и так далее. Хотя определение наследования простое, оно может стать сложной и запутанной вещью при неразумном использовании. Наследование — это скорее абстракция, о которой мы можем только говорить, а не касаться напрямую. Хотя во многих ситуациях можно имитировать наследование с помощью композиции, часто это оказывается громоздким. Цель композиции очевидна: сделать из частей целое. Цель наследования немного сложнее, потому что наследование служит двум целям: семантике и механике.
Семантика наследования
Наследование фиксирует семантику (значение) в иерархии классификации (таксономии), упорядочивая понятия от обобщенных до специализированных, группируя связанные понятия в поддеревья и т.д. Семантика класса в основном определяется его интерфейсом, набором сообщений, на которые он отвечает, но часть семантики также содержится в наборе сообщений, которые отправляет класс. При наследовании от класса вы неявно принимаете на себя ответственность за все сообщения, которые суперкласс отправляет от вашего имени, а не только за сообщения, которые он может получить. Это делает подкласс более тесно связанным со своим суперклассом, чем если бы он просто использовал экземпляр суперкласса в качестве компонента, а не наследовал от него. Обратите внимание, что даже в классах, которые мало что «делают», имя класса сообщает разработчику важную семантическую информацию о предметной области.
Механика наследования
Наследование захватывает механику, кодируя представление данных (полей) и поведения (методов) класса и делая его доступным для повторного использования и расширения в подклассах. Механически подкласс наследует реализацию суперкласса и, следовательно, его интерфейс.
Двойная цель наследования 7 в большинстве современных языков ООП, как мне кажется, является причиной большей путаницы. Многие думают, что «повторное использование кода» — основная цель наследования, но это не единственная его цель. Чрезмерный акцент на повторном использовании может привести к трагически ошибочным проектам. Давайте посмотрим на пару примеров.
Как неправильно использовать наследование — пример 1
Начнем с простого и чрезвычайно распространенного примера неправильного использования наследования:
class Stack extends ArrayList { public void push(значение объекта) {…} общедоступный объект pop() { … } }
Этот класс будет функционировать как стек, но его интерфейс сильно раздут. Открытый интерфейс этого класса не только push и pop, как можно было бы ожидать от класса с именем Stack, он также включает в себя получение, установку, добавление, удаление, очистку и кучу других сообщений, унаследованных от ArrayList, которые не подходят для Куча.
Вы можете переопределить все ненужные методы и, возможно, адаптировать некоторые полезные (например, очистку), но для того, чтобы скрыть ошибку моделирования, потребуется много работы. На самом деле три ошибки моделирования, одна семантическая, одна механическая, одна и та, и другая:
- Семантически утверждение «Стек — это ArrayList» неверно; Stack не является правильным подтипом ArrayList. Предполагается, что стек обеспечивает соблюдение принципа «последним пришел — первым вышел» — ограничение, которое легко удовлетворяется интерфейсом push/pop, но не обеспечивается интерфейсом ArrayList.
- Механически наследование от ArrayList нарушает инкапсуляцию; использование ArrayList для хранения коллекции объектов стека — это выбор реализации, который должен быть скрыт от потребителей.
- Наконец, реализация стека путем наследования от ArrayList представляет собой междоменное отношение: ArrayList — коллекция с произвольным доступом; Стек — это концепция организации очереди со специально ограниченным (неслучайным) доступом 8 . Это разные области моделирования.
Последняя проблема важна, но немного тонка, поэтому давайте рассмотрим ее на другом примере.
Как неправильно использовать наследование — пример 2
Создание класса предметной области путем наследования от класса реализации является распространенным злоупотреблением наследованием. Например, предположим, что мы хотим что-то сделать с определенным сегментом наших клиентов. Самый простой и очевидный способ — создать подкласс ArrayList
Неправильно. Это будут отношения междоменного наследования, и их следует избегать:
- ArrayList
уже является подклассом списка, набор утилит — класс реализации . - CustomerGroup — это еще один подкласс — класс домена .
- Классы предметной области должны использовать классы реализации , а не наследоваться от них.
Пространство реализации должно быть невидимым на уровне домена. Когда мы думаем о том, что делает наше программное обеспечение, мы работаем на уровне предметной области; мы не хотим отвлекаться на детали того, как он работает. Если мы сосредоточимся только на «повторном использовании кода» через наследование, мы будем постоянно попадать в эту ловушку.
Одиночное наследование не является проблемой
Одиночное наследование по-прежнему является наиболее распространенной моделью ООП; одиночное наследование обязательно является наследованием реализации, что может привести к сильной связи между классами. Проблема, по-видимому, заключается в том, что у нас есть только один путь наследования, который можно использовать для моделирования как наших механических, так и семантических потребностей. Если вы используете его для одного, вы не можете использовать его для другого. Так не решает ли множественное наследование эту проблему?
№ . Отношения наследования не должны пересекать границы домена (домен реализации и домен приложения). Наследование CustomerGroup от ArrayList
Предпочтительное (по крайней мере для меня!) решение состоит в том, чтобы наследовать от служебных классов столько, сколько необходимо для реализации ваших механических структур, а затем использовать эти структуры в классах предметной области посредством композиции, а не наследования. Позвольте мне повторить это:
Если вы не создаете класс реализации, вы не должны наследовать от класса реализации.
Это одна из самых распространенных проблем новичков — потому что это так удобно! — а причины, по которым это неправильно, нечасто обсуждаются в литературе по программированию, поэтому я повторю еще раз: ваши классы предметной области должны использовать классы реализации , а не быть одним из них. Разделяйте эти таксономии/домены.
Итак, когда и как мы должны использовать наследование?
Использование скважины наследства
Наиболее распространенное и полезное использование наследования для дифференциального программирования . Нам нужен виджет, похожий на существующий класс Widget, но с некоторыми изменениями и улучшениями. В этом случае наследуйте; это уместно, потому что наш подкласс по-прежнему является виджетом, мы хотим повторно использовать весь интерфейс и реализацию из суперкласса, и наши изменения в основном добавка . Если вы обнаружите, что ваш подкласс удаляет вещи, предоставленные суперклассом, задайте вопрос о наследовании от этого суперкласса.
Наследование наиболее полезно для группировки связанных наборов понятий, идентификации семейств классов и в целом для организации имен и понятий, описывающих предметную область. По мере того, как мы углубляемся в реализацию системы, мы можем обнаружить, что наши первоначальные обобщения концепций предметной области, зафиксированные в наших иерархиях наследования, начинают разрушаться. Не бойтесь разбирать иерархии наследования на наборы взаимодополняющих взаимодействующих интерфейсов и компонентов, когда код ведет вас в этом направлении 9 .
Как решить: состав или наследство?
Если у вас есть ситуация, когда сработает либо композиция, либо наследование, рассмотрите возможность разделения обсуждения дизайна на две части:
- Представление/реализация концепций вашей предметной области является одним измерением
- Семантика понятий вашей предметной области и их взаимосвязь друг с другом — это второе измерение
В общем, наследование в пределах одного из этих измерений — это нормально. Проблема возникает, когда мы забываем разделить два измерения и начинаем наследовать через межпространственные границы.
Если вы обнаружите, что используете компонент для обеспечения подавляющего большинства своих функций, создавая методы переадресации в своем классе для вызова методов компонента, показывая поля компонента и т. д., рассмотрите возможность наследования — для некоторых или всех желаемое поведение — может быть более подходящим.
Нет никакой замены объектному моделированию и критическому проектному мышлению. Но если вам нужны какие-то рекомендации, рассмотрите их —
Наследование следует использовать только в следующих случаях:
- Оба класса находятся в одном логическом домене
- Подкласс является правильным подтипом надкласса
- Реализация суперкласса необходима или подходит для подкласса
- Улучшения, сделанные подклассом, в основном аддитивны.
Бывают моменты, когда все эти вещи сходятся:
- Моделирование предметной области более высокого уровня
- Фреймворки и расширения фреймворка
- Дифференциальное программирование
Если вы не делаете ни одной из этих вещей, вам, вероятно, не понадобится очень часто наследование классов. «Предпочтение» композиции — это не вопрос «лучше», это вопрос «наиболее подходящего» для ваших нужд в конкретном контексте.
Надеемся, что эти рекомендации помогут вам заметить разницу.
Удачного кодирования!
Приложение
Особая благодарность следующим мыслителям за ценный вклад и комментарии: Питу Ходжсону, Тиму Брауну, Скотту Робинсону, Мартину Фаулеру, Минди Ор, Шону Ньюэму, Сэму Гибсону и Махендре Кария.
1. Первый официально объектно-ориентированный язык SIMULA 67 родился в 1967 году. Объектно-ориентированному программированию исполнилось 48 лет!
2. Программисты систем и приложений перешли на C++ в середине 1980-х, но повсеместное распространение ООП пришлось ждать еще десятилетие.
3. да, я упрощаю, игнорируя слушателей/делегатов событий/и т.д.; стараясь сделать эту статью короткой!
4. Amazon заявляет о 24 777 книгах по теме объектно-ориентированного программирования на момент написания этой статьи
5.