stringtranslate.com

Общая функция

В компьютерном программировании обобщенная функция — это функция, определенная для полиморфизма .

В статически типизированных языках

В статически типизированных языках (таких как C++ и Java ) термин «универсальные функции» относится к механизму полиморфизма времени компиляции ( статической диспетчеризации ), в частности, к параметрическому полиморфизму . Это функции, определенные с помощью TypeParameters и предназначенные для разрешения с помощью информации о типе времени компиляции . Компилятор использует эти типы для создания экземпляров подходящих версий, соответствующим образом разрешая любую перегрузку функции .

В общей объектной системе Lisp

В некоторых системах объектно-ориентированного программирования, таких как Common Lisp Object System (CLOS) [1] и Dylan , универсальная функция представляет собой сущность, состоящую из всех методов, имеющих одно и то же имя. Обычно универсальная функция представляет собой экземпляр класса, который наследуется как от функции , так и от стандартного объекта . Таким образом, универсальные функции — это как функции (которые можно вызывать с аргументами и применять к ним), так и обычные объекты. В книге «Искусство метаобъектного протокола» подробно объясняется реализация и использование общих функций CLOS.

Одним из первых расширений объектно-ориентированного программирования для Lisp является Flavors . Он использовал обычную парадигму отправки сообщений под влиянием Smalltalk . Синтаксис Flavors для отправки сообщения:

 ( отправить объект : сообщение )  

В New Flavors было решено, что сообщение должно быть реальной функцией и использовать обычный синтаксис вызова функции:

 ( объект сообщения ) 

message теперь является общей функцией , объектом и функцией сам по себе. Отдельные реализации сообщения называются методами .

Эта же идея была реализована в CommonLoops . [2] Новые разновидности и CommonLoops оказали основное влияние на объектную систему Common Lisp.

Пример

Общий Лисп

Определите общую функцию с двумя параметрами object-1 и object-2. Имя универсальной функции —collide .

 ( defgeneric столкновение ( объект-1 объект-2 ))   

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


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

  1. ^ Объектная система Common Lisp: обзор
  2. ^ «CommonLoops, объединение Lisp и объектно-ориентированное программирование» (PDF) . Архивировано из оригинала (PDF) 4 июня 2011 г. Проверено 10 декабря 2009 г.