Общая функция - 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 класс получателя является единственным определяющим фактором, определяющим, какой фрагмент кода вызывается: типы или значения аргументов не имеют значения (разовая отправка ). На языке программирования с множественная отправка когда вызывается универсальная функция, отправка метода происходит на основе всех аргументов, а не только одного привилегированного. Новые вкусы также предоставляет общие функции, но только разовую отправку.

Рекомендации

  1. ^ Объектная система Common Lisp: обзор
  2. ^ "CommonLoops, слияние Lisp и объектно-ориентированного программирования" (PDF). Архивировано из оригинал (PDF) на 2011-06-04. Получено 2009-12-10.