Trait (компьютерное программирование) - Википедия - Trait (computer programming)

В компьютерное программирование, а черта это концепция, используемая в объектно-ориентированного программирования, который представляет собой набор методы которые можно использовать для расширения функциональности учебный класс.[1][2]

Характеристики

Обе черты предоставляют набор методов, реализующих поведение класса, и требуют, чтобы класс реализовал набор методов, которые параметризовать предоставленное поведение.

Для межобъектного взаимодействия черты находятся где-то между объектно-ориентированным протокол (интерфейс) и миксин. Интерфейс может определять одно или несколько вариантов поведения через сигнатуры методов, в то время как черта определяет поведение с помощью полных определений метода: т. е. включает тело методов. Напротив, миксины включают полные определения методов и могут также нести государственный через переменную-член, в то время как черты обычно этого не делают.

Следовательно, объект, определенный как признак, создается как сочинение методов, которые могут использоваться другими классами без необходимости множественное наследование. В случае коллизия имен, когда несколько признаков, которые будут использоваться классом, имеют метод с тем же именем, программист должен явно указать, какой из этих методов будет использоваться в классе; таким образом вручную решая проблема с алмазом множественного наследования. Это отличается от других методов композиции в объектно-ориентированном программировании, где конфликтующие имена автоматически разрешаются правила определения объема работ.

В то время как миксины можно составлять только с помощью наследование operation, traits предлагают гораздо более широкий выбор операций, в том числе:[3][4]

  • симметричная сумма: операция, которая объединяет два непересекающихся признака для создания нового признака
  • отменять (или же асимметричная сумма): операция, которая формирует новый признак, добавляя методы к существующему признаку, возможно, отменяя некоторые из его методов.
  • псевдоним: операция, которая создает новую характеристику путем добавления нового имени для существующего метода
  • исключение: операция, которая формирует новый признак, удаляя метод из существующего признака. (Объединение этого с операцией псевдонима дает мелкое переименование операция).

Черты складываются следующим образом:

  • Состав признаков коммутативен; порядок добавления признаков не имеет значения. Например, учитывая черту S = А + B, затем черта Т = B + А такой же как S.
  • Из состава исключены конфликтующие методы.
  • Вложенные черты эквивалентны уплощенным чертам; Иерархия композиции не влияет на поведение черт. Например, учитывая черту S = А + Икс, куда Икс = B + C, затем черта Т = А + B + C такой же как S.[1]

Поддерживаемые языки

Черты исходят из языка программирования Себя[5] и поддерживаются следующими языками программирования:

  • AmbientTalk: Сочетает в себе свойства свойств Self (множественное наследование на основе объектов) и Болтовня с Писк черты характера (требующие явной композиции признаков программистом). Он основан на исследовании сохранный и замораживаемый черты, чтобы включить состояние внутри черт, что не разрешалось в первых определениях.[6]
  • C #: Начиная с версии 8.0, C # поддерживает методы интерфейса по умолчанию,[7] которые обладают некоторыми свойствами черт.[8]
  • C ++: Используется в Стандартная библиотека шаблонов и Стандартная библиотека C ++ поддерживать общие классы контейнера[9][10] и в Способствовать росту Библиотека TypeTraits.[11]
  • Завиток: Абстрактные классы как миксины допускают реализацию методов и, таким образом, составляют черты под другим именем.[нужна цитата ]
  • D: Начиная с версии 2.003, языковое расширение __traits[12] и модуль std.traits[13] Вспомогательные шаблоны предоставляют признаки времени компиляции. Вместе с другими языковыми функциями (в частности, шаблонами и миксинами) они позволяют гибкое автоматическое создание методов на основе интерфейсов и типов. D также допускает явное наложение псевдонимов для методов и переменных-членов, включая пересылку в несколько классов-членов.[14]
  • Крепость[15]
  • Groovy: Начиная с версии 2.3[16]
  • Haskell: В Haskell черты известны как Типовые классы.
  • Haxe: Начиная с версии 2.4.0.[17] Называется Статическое расширение[18] в руководстве он использует с помощью ключевое слово
  • Ява: Начиная с версии 8, Java поддерживает методы по умолчанию,[19] которые обладают некоторыми свойствами черт.[20][21]
  • JavaScript: Черты могут быть реализованы через функции и делегирование[22] или через библиотеки, которые предоставляют признаки.[23][24][25]
  • Юля: Некоторые пакеты реализуют черты характера, например,[26]
  • Котлин: Черты характера были названы интерфейсы[27] начиная с M12.[28]
  • Лассо[29]
  • OCaml: Черты могут быть реализованы с использованием различных языковых функций: включение модулей и типов модулей, функторы и типы функторов, наследование классов и типов классов и так далее.
  • Perl: Называется роли, они реализованы в библиотеках Perl, таких как лось, Role :: Tiny и Role :: Basic. Роли являются частью родственного языка Раку.[30]
  • PHP: Начиная с версии 5.4,[31][32] PHP позволяет пользователям указывать шаблоны, которые предоставляют возможность «наследовать» более чем от одного (типичного) класса, как псевдо множественное наследование.
  • Python: Через стороннюю библиотеку,[33][34] или через классы миксинов более высокого порядка[35]
  • Ракетка: Поддерживает черты в виде библиотеки и использует макросы, структуры и первоклассные классы для их реализации.[36]
  • Рубин: Модульные миксины можно использовать для реализации трейтов.[37]
  • Ржавчина[38]
  • Scala[39][40] черта встроена и поддерживается ключевым словом черта.
  • Болтовня: Черты реализованы в двух диалектах Smalltalk, Писк[1] и Pharo.[41]
  • Быстрый: Черты могут быть реализованы с помощью расширения протокола.[42]

Примеры

C #

В C # 8.0 можно определить реализацию как член интерфейса.

с помощью Система;пространство имен CSharp8НовыйФункции{    интерфейс ILogger    {        // Традиционные методы интерфейса        пустота Бревно(нить сообщение);        пустота LogError(Исключение исключение);        // Метод интерфейса по умолчанию        пустота LogWarning(нить сообщение)        {            Консоль.WriteLine(сообщение);        }            }    учебный класс Регистратор : ILogger    {        общественный пустота Бревно(нить сообщение)        {            Консоль.WriteLine(сообщение);        }        общественный пустота LogError(Исключение исключение)        {            Консоль.WriteLine(исключение.Нанизывать());        }    }    учебный класс Программа    {        статический пустота Главный(нить[] аргументы)        {            ILogger регистратор = новый Регистратор();            регистратор.LogWarning("Некоторое предупреждающее сообщение");        }    }}

PHP

В этом примере трейт используется для улучшения других классов:

// Шаблончерта TSingleton{    частный статический $ _instance = ноль;    частный функция __construct() {} // Должен иметь частный конструктор по умолчанию и не открывать его в классе    общественный статический функция getInstance()    {        если (ноль === себя::$ _instance) {            себя::$ _instance = новый себя();        }        возвращаться себя::$ _instance;    }}учебный класс FrontController{    использовать TSingleton;}// Также можно использовать в уже расширенных классахучебный класс Интернет сайт расширяет SomeClass{    использовать TSingleton;}

Это позволяет моделировать аспекты множественного наследования:

черта Основание{    общественный $ x, $ y, ширина $, высота $;}черта TM подвижный{    общественный функция moveTo($ x, $ y)    {        // …    }}черта Размерный{    общественный функция изменить размер($ newWidth, $ newHeight)    {        // …    }}учебный класс Прямоугольник{    использовать Основание, TM подвижный, Размерный;    общественный функция Цвет заливки($ цвет)    {        // …    }}

Ржавчина

Типаж в Rust объявляет набор методов, которые должен реализовать тип.[43] Компиляторы Rust требуют, чтобы трейты были эксплицированы, что обеспечивает безопасность дженерики в Rust.

// тип T должен иметь черту "Ord"// чтобы можно было выполнять операции ">" и "<"fn get_max<Т: Ord>(а: &[Т])-> Вариант<&Т>{позволятьмутрезультат=а.получать(0)?;запва{если*п>*результат{результат=&п;}}Немного(результат)}

Чтобы упростить утомительную и повторяющуюся реализацию таких черт, как Отлаживать и Ord, то выводить макрос может использоваться, чтобы запросить компиляторы автоматически сгенерировать определенные реализации.[44] К производным признакам относятся: Клонировать, Копировать, Отлаживать, Дефолт, PartialEq, Уравнение, PartialOrd, Ord и Хеш.

Смотрите также

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

  1. ^ а б c Шерли, Нафанаил; Дюкасс, Стефан; Нирстраз, Оскар; Черный, Эндрю П. (2003). «Черты характера: составные единицы поведения» (PDF). Труды Европейской конференции по объектно-ориентированному программированию (ECOOP). Конспект лекций по информатике. 2743: 248–274.
  2. ^ Дюкасс, Стефан; Нирстраз, Оскар; Шерли, Нафанаил; Вуйтс, Роэл; Блэк, Эндрю П. (март 2006 г.). «Черты: механизм точного повторного использования». Транзакции ACM по языкам и системам программирования. 28 (2): 331–388. Дои:10.1145/1119479.1119483.
  3. ^ Фишер, Кэтлин; Реппи, Джон (2003). «Статически типизированные признаки» (PDF). Чикагский университет. В архиве (PDF) с оригинала 17 мая 2004 г. Цитировать журнал требует | журнал = (помощь)
  4. ^ Фишер, Кэтлин; Реппи, Джон (2004). Типизированное исчисление признаков (PDF). 11-й семинар по основам объектно-ориентированного программирования. Чикагский университет.
  5. ^ Карри, Гаэль; Баер, Ларри; Липки, Даниэль; Ли, Брюс (1982). Черты: подход к подклассу множественного наследования. Конференция SIGOA по офисным информационным системам. Филадельфия, Пенсильвания, США: ACM Press. С. 1–9. Дои:10.1145/966873.806468.
  6. ^ Ван Катсем, Том; Бергель, Александр; Дюкасс, Стефан; Де Мойтер, Вольфганг (2009). Добавление состояния и контроля видимости к признакам с помощью лексической вложенности (PDF). Европейская конференция по объектно-ориентированному программированию (ECOOP 2009). Конспект лекций по информатике. 5653. Springer-Verlag. С. 220–243. Дои:10.1007/978-3-642-03013-0_11. ISBN  978-3-642-03012-3.
  7. ^ «Методы интерфейса по умолчанию». Что нового в C # 8.0. Microsoft. Получено 29 ноября, 2019.
  8. ^ «Интерфейсы в C # 8.0 претерпевают изменения». Реализация по умолчанию в интерфейсах в C # 8.0. Говорящая дотнет. Получено 29 ноября, 2019.
  9. ^ "признаки_тератора <Итератор>". Стандартная библиотека шаблонов. SGI.
  10. ^ Майерс, Натан С. (июнь 1995 г.). «Черты характера: новая и полезная шаблонная техника». Отчет C ++. Получено 23 января, 2016.
  11. ^ Авраамс, Дэвид. «Общие методы программирования: черты характера». Библиотеки Boost C ++. Получено 23 января, 2016.
  12. ^ "Черты". Справочник по языку D. Цифровой Марс. Получено 23 января, 2016.
  13. ^ "std.traits". Язык D - Справочник по библиотеке. Цифровой Марс. Получено 23 января, 2016.
  14. ^ «Классы». Справочник по языку D. Цифровой Марс. Получено 23 января, 2016.
  15. ^ Стил, Гай; Мессен, Ян-Виллем (11 июня 2006 г.). "Учебное пособие по языку программирования Fortress" (PDF). Sun Microsystems. Получено 23 января, 2016.
  16. ^ «Ориентация на объект: черты характера». Язык программирования Groovy. Получено 23 января, 2016.
  17. ^ «Haxe 2.4.0 - Haxe - кроссплатформенный инструментарий». Haxe - кроссплатформенный инструментарий. Получено 2017-09-12.
  18. ^ «Руководство - Haxe - Кросс-платформенный инструментарий». Haxe - кроссплатформенный инструментарий. Получено 2017-09-12.
  19. ^ «Методы по умолчанию». Учебники по Java. Oracle. Получено 23 января, 2016.
  20. ^ Боно, Вивиана; Менса, Энрико; Наддео, Марко (сентябрь 2014 г.). Трафик-ориентированное программирование в Java 8. Международная конференция по принципам и практике программирования на платформе Java: виртуальные машины, языки и инструменты (PPPJ ’14). Краков, польша.
  21. ^ Форслунд, Эмиль (3 февраля 2016 г.). «Определение шаблона признаков в Java». Эпоха Явы. Архивировано из оригинал 4 августа 2016 г.. Получено 3 февраля, 2016.
  22. ^ Селигер, Петр (11 апреля 2014 г.). «Множество талантов JavaScript». Получено 23 января, 2015.
  23. ^ "Traits.js: особенности для JavaScript". Получено 23 января, 2016.
  24. ^ Ван Катсем, Том; Миллер, Марк С. (2012). «Надежная композиция признаков для Javascript» (PDF). Наука компьютерного программирования. Получено 23 января, 2016.
  25. ^ "CocktailJS". Получено 23 января, 2016.
  26. ^ mauro3. "SimpleTraits.jl". Получено 23 марта, 2017.
  27. ^ «Интерфейсы». Ссылка на Котлин. JetBrains. Получено 23 января, 2016.
  28. ^ Бреслав, Андрей (29 мая 2015 г.). "Kotlin M12 вышел!". Котлин Блог. JetBrains. Получено 23 января, 2016.
  29. ^ "Черты". Руководство по языку лассо. ЛассоСофт. 6 января 2014 г.. Получено 23 января, 2016.
  30. ^ хроматический (30 апреля 2009 г.). "Почему ролей Perl". Получено 23 января, 2016.
  31. ^ "Черты". Документация PHP. Группа PHP. Получено 23 января, 2016.
  32. ^ Марр, Стефан (9 января 2011 г.). «Запрос комментариев: горизонтальное повторное использование для PHP». PHP.net вики. Группа PHP. Получено 31 января, 2011.
  33. ^ Перя, Теппо. "Документация py3traits". Получено 23 января, 2016.
  34. ^ Перя, Теппо (25 марта 2015 г.). "py2traits". Получено 23 января, 2016.
  35. ^ "Классы микширования высшего порядка". Архивировано из оригинал на 2016-10-09.
  36. ^ "Черты". Справочник по ракетке. Получено 23 января, 2016.
  37. ^ Дэвид Насби (14 февраля 2004 г.). «Черты в рубине». Руби Нэсби. Получено 23 января, 2016.
  38. ^ "Черты". Язык программирования Rust. Получено 30 сентября, 2019.
  39. ^ "Черты". Экскурсия по Скале. Федеральная политехническая школа Лозанны. Получено 23 января, 2016.
  40. ^ Ньюард, Тед (29 апреля 2008 г.). "Руководство по Scala для Java-разработчиков: особенности и поведение". IBM developerWorks. IBM. Получено 23 января, 2016.
  41. ^ «Черты характера за 10 минут». Pharo: The CollaborActive Книга. Получено 23 января, 2016.
  42. ^ Холлеманс, Маттейс (22 июля 2015 г.). «Миксины и черты в Swift 2.0». Получено 23 января, 2016.
  43. ^ "Traits - Введение в программирование на Rust".
  44. ^ "Traits - язык программирования Rust".

внешняя ссылка