Jump to content

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

(Перенаправлено из универсальных функций )

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

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

[ редактировать ]

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


  1. ^ Объектная система Common Lisp: обзор
  2. ^ «CommonLoops, объединение Lisp и объектно-ориентированное программирование» (PDF) . Архивировано из оригинала (PDF) 4 июня 2011 г. Проверено 10 декабря 2009 г.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 4e084654afac2272b53cecaf7d72baec__1694174280
URL1:https://arc.ask3.ru/arc/aa/4e/ec/4e084654afac2272b53cecaf7d72baec.html
Заголовок, (Title) документа по адресу, URL1:
Generic function - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)