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