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

Из Википедии, бесплатной энциклопедии

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

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

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


Ссылки [ править ]

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