Общая функция - Generic function
В компьютерное программирование, а общая функция функция, определенная для полиморфизм.
На статически типизированных языках
В статически типизированных языках (например, C ++ и Ява ), период, термин общие функции относится к механизму полиморфизм времени компиляции (статическая отправка ), конкретно параметрический полиморфизм. Это функции, определенные с помощью Тип Параметры, предназначенный для решения с время компиляции информация о типе. Компилятор использует эти типы для создания подходящих версий, разрешая любые перегрузка функции соответственно.
В объектной системе Common Lisp
В некоторых системах для объектно-ориентированного программирования такой как Общая объектная система Lisp (ЗАКРЫТЬ)[1] и Дилан, а общая функция это объект, состоящий из всех методов с одинаковым именем. Обычно общая функция это экземпляр класса, который наследует как из функция и стандартный объект. Таким образом, универсальные функции - это как функции (которые можно вызывать с аргументами и применять к ним), так и обычные объекты. Книга Искусство протокола метаобъектов подробно объясняет реализацию и использование общих функций CLOS.
Одним из первых расширений объектно-ориентированного программирования для Lisp является Ароматизаторы. Он использовал обычную парадигму отправки сообщений под влиянием Болтовня. Синтаксис Flavors для отправки сообщения:
(Отправить объект :сообщение)
С помощью New Flavors было решено, что сообщение должно быть реальной функцией, и следует использовать обычный синтаксис вызова функции:
(сообщение объект)
сообщение сейчас это общая функция, объект и функция сами по себе. Индивидуальные реализации сообщение называются методы.
Та же идея была реализована в CommonLoops.[2] Новые разновидности и CommonLoops оказали основное влияние на объектную систему Common Lisp.
пример
Common Lisp
Определите универсальную функцию с двумя параметрами: объект-1 и объект-2. Имя универсальной функции столкнуться.
(defgeneric столкнуться (объект-1 объект-2))
Методы, принадлежащие универсальной функции, определены вне классов. Здесь мы определяем метод для универсальной функции. столкнуться который специализирован для классов asteroid (первый параметр object-1) и космического корабля (второй параметр object-2). Параметры используются как обычные переменные внутри тела метода. Не существует специального пространства имен, которое имеет доступ к слотам классов.
(defmethod столкнуться ((объект-1 астероид) (объект-2 космический корабль)) (формат т "астероид ~ a сталкивается с космическим кораблем ~ a" объект-1 объект-2))
Вызов универсальной функции:
? (столкнуться (make-instance астероид) (make-instance 'космический корабль))астероид #<АСТЕРОИД 4020003FD3> сталкивается с космический корабль #<ПРОСТРАНСТВО 40200048CB>
Common Lisp также может извлекать отдельные методы из общей функции. FIND-METHOD находит метод из общей функции столкнуться специализированный для классов астероид и космический корабль.
? (поисковый метод #'столкнуться ноль (список (найти класс астероид) (найти класс 'космический корабль)))#<СТАНДАРТНЫЙ МЕТОД КОЛЛИД Ноль (АСТЕРОИД ПРОСТРАНСТВО) 4150015E43>
Сравнение с другими языками
Общие функции примерно соответствуют тому, что Болтовня термины методы, с заметным исключением, что в Smalltalk класс получателя является единственным определяющим фактором, определяющим, какой фрагмент кода вызывается: типы или значения аргументов не имеют значения (разовая отправка ). На языке программирования с множественная отправка когда вызывается универсальная функция, отправка метода происходит на основе всех аргументов, а не только одного привилегированного. Новые вкусы также предоставляет общие функции, но только разовую отправку.
Рекомендации
- ^ Объектная система Common Lisp: обзор
- ^ "CommonLoops, слияние Lisp и объектно-ориентированного программирования" (PDF). Архивировано из оригинал (PDF) на 2011-06-04. Получено 2009-12-10.