Общая функция
Полиморфизм |
---|
Специальный полиморфизм |
Параметрический полиморфизм |
Подтипирование |
В компьютерном программировании — обобщенная функция это функция, определенная для полиморфизма .
В статически типизированных языках
[ редактировать ]В статически типизированных языках (таких как C++ и Java ) термин «универсальные функции» относится к механизму полиморфизма времени компиляции ( статической диспетчеризации ), в частности параметрическому полиморфизму . Это функции, определенные с помощью TypeParameters и предназначенные для разрешения с помощью информации о типе времени компиляции . Компилятор использует эти типы для создания экземпляров подходящих версий, соответствующим образом разрешая любую перегрузку функции .
В общей объектной системе Lisp
[ редактировать ]В некоторых системах объектно-ориентированного программирования, таких как Common Lisp Object System (CLOS), [1] и Дилан , универсальная функция — это сущность, состоящая из всех методов с одинаковыми именами. Обычно универсальная функция представляет собой экземпляр класса, который наследуется как от функции , так и от стандартного объекта . Таким образом, универсальные функции — это как функции (которые можно вызывать с аргументами и применять к ним), так и обычные объекты. В книге « Искусство метаобъектного протокола» подробно объясняется реализация и использование общих функций CLOS.
Одним из первых расширений объектно-ориентированного программирования для Lisp является Flavors . Он использовал обычную парадигму отправки сообщений под влиянием Smalltalk . Синтаксис Flavors для отправки сообщения:
(send object :message)
В New Flavors было решено, что сообщение должно быть реальной функцией и использовать обычный синтаксис вызова функции:
(message object)
message теперь является общей функцией , объектом и функцией сам по себе. Отдельные реализации сообщения называются методами .
Эта же идея была реализована в CommonLoops . [2] Новые разновидности и CommonLoops оказали основное влияние на объектную систему Common Lisp.
Пример
[ редактировать ]Общий Лисп
[ редактировать ]Определите общую функцию с двумя параметрами object-1 и object-2. Имя универсальной функции —collide .
(defgeneric collide (object-1 object-2))
Методы, принадлежащие универсальной функции, определяются вне классов. Здесь мы определяем метод для общей функции столкновений , которая специализирована для классов астероид (первый параметр объекта-1) и космический корабль (второй параметр объекта-2). Параметры используются как обычные переменные внутри тела метода. Не существует специального пространства имен, которое имело бы доступ к слотам классов.
(defmethod collide ((object-1 asteroid) (object-2 spaceship))
(format t "asteroid ~a collides with spaceship ~a" object-1 object-2))
Вызов общей функции:
? (collide (make-instance 'asteroid) (make-instance 'spaceship))
asteroid #<ASTEROID 4020003FD3> collides with spaceship #<SPACESHIP 40200048CB>
Common Lisp также может извлекать отдельные методы из универсальной функции. FIND-METHOD находит метод из общей функции Collide, специализированной для классов asteroid и spaceship .
? (find-method #'collide nil (list (find-class 'asteroid) (find-class 'spaceship)))
#<STANDARD-METHOD COLLIDE NIL (ASTEROID SPACESHIP) 4150015E43>
Сравнение с другими языками
[ редактировать ]Общие функции примерно соответствуют тому, что в Smalltalk называют методами , с заметным исключением: в Smalltalk класс получателя является единственным фактором, определяющим, какой фрагмент кода вызывается: типы или значения аргументов не имеют значения ( одиночная отправка ). В языке программирования с множественной диспетчеризацией при вызове универсальной функции диспетчеризация метода происходит на основе всех аргументов, а не только одного привилегированного. Новые вкусы также предоставляют общие функции, но только с одной отправкой.
В JavaScript универсальная функция — это функция, которая может работать со значениями разных типов, а не со значениями определенного типа. Это достигается за счет использования параметров типа или динамической проверки типа обрабатываемого значения. Одним из распространенных вариантов использования универсальных функций в JavaScript является создание повторно используемых функций, которые могут работать с различными типами данных, такими как массивы, строки или объекты. Система динамической типизации JavaScript делает его особенно подходящим для создания универсальных функций, поскольку при необходимости значения можно легко привести или преобразовать в другие типы.
Ссылки
[ редактировать ]- ^ Объектная система Common Lisp: обзор
- ^ «CommonLoops, объединение Lisp и объектно-ориентированное программирование» (PDF) . Архивировано из оригинала (PDF) 4 июня 2011 г. Проверено 10 декабря 2009 г.