Общая функция
Полиморфизм |
---|
Специальный полиморфизм |
Параметрический полиморфизм |
Подтипирование |
В компьютерном программировании обобщенная функция — это функция, определенная для полиморфизма .
В статически типизированных языках [ править ]
В статически типизированных языках (таких как C++ и Java ) термин «универсальные функции» относится к механизму полиморфизма времени компиляции ( статической диспетчеризации ), в частности параметрическому полиморфизму . Это функции, определенные с помощью TypeParameters и предназначенные для разрешения с помощью информации о типе времени компиляции . Компилятор использует эти типы для создания экземпляров подходящих версий, соответствующим образом разрешая любую перегрузку функции .
В объектной системе Common Lisp [ править ]
В некоторых системах объектно-ориентированного программирования, таких как Common Lisp Object System (CLOS), [1] и Дилан , универсальная функция — это сущность, состоящая из всех методов с одинаковыми именами. Обычно универсальная функция представляет собой экземпляр класса, который наследуется как от функции , так и от стандартного объекта . Таким образом, универсальные функции — это как функции (которые можно вызывать с аргументами и применять к ним), так и обычные объекты. В книге « Искусство метаобъектного протокола» подробно объясняется реализация и использование общих функций CLOS.
Одним из первых расширений объектно-ориентированного программирования для Lisp является Flavors . Он использовал обычную парадигму отправки сообщений под влиянием Smalltalk . Синтаксис Flavors для отправки сообщения:
( отправить объект : сообщение )
В New Flavors было решено, что сообщение должно быть реальной функцией и использовать обычный синтаксис вызова функции:
( сообщения объект )
message теперь является общей функцией , объектом и функцией сам по себе. Отдельные реализации сообщения называются методами .
Эта же идея была реализована в CommonLoops . [2] Новые разновидности и CommonLoops оказали основное влияние на объектную систему Common Lisp.
Пример [ править ]
Общий Лисп [ править ]
Определите общую функцию с двумя параметрами object-1 и object-2. Имя универсальной функции —collide .
( defgeneric столкновение ( объект-1 объект-2 ))
Методы, принадлежащие универсальной функции, определяются вне классов. Здесь мы определяем метод для общей функции Collide , который специализирован для классов астероид (первый параметр объекта-1) и космический корабль (второй параметр объекта-2). Параметры используются как обычные переменные внутри тела метода. Не существует специального пространства имен, которое имело бы доступ к слотам классов.
( defmethod столкновение (( объект-1 астероид ) ( объект-2 космический корабль ))
( формат t "астероид ~a сталкивается с космическим кораблем ~a" объект-1 объект-2 ))
Вызов общей функции:
? ( collide ( make-instance 'asteroid ) ( make-instance 'spaceship ))
астероид № <ASTEROID 4020003FD3> сталкивается с космическим кораблем № <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 г.