stringtranslate.com

Черта (компьютерное программирование)

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

Обоснование

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

Черты решают эти проблемы, позволяя классам использовать эту черту и получать желаемое поведение. Если класс использует более одного признака, порядок использования этих признаков не имеет значения. Методы, предоставляемые типажами, имеют прямой доступ к данным класса.

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

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

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

Операции, которые можно выполнять с признаками, включают: [3] [4]

Если метод исключен из признака, этот метод должен быть предоставлен классом, который использует этот признак, или родительским классом этого класса. Это связано с тем, что методы, предоставляемые этим признаком, могут вызывать исключенный метод.

Состав признаков является коммутативным (т.е. для данных признаков A и B A + B эквивалентно B + A ) и ассоциативным (т. е . для данных признаков A , B и C ( A + B ) + C эквивалентно A + ( B + С )). [1]

Ограничения

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

Требуемые методы

Если признак требует, чтобы класс-потребитель предоставил определенные методы, признак не может знать, являются ли эти методы семантически эквивалентными потребностям признака. Для некоторых динамических языков, таких как Perl, требуемый метод можно идентифицировать только по имени метода, а не по полной сигнатуре метода , что затрудняет гарантию соответствия требуемого метода.

Исключение методов

Если метод исключен из типажа, этот метод становится «обязательным» методом для этого типажа, поскольку его могут вызывать другие методы типажа.

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

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

Примеры

С#

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

используя систему ; пространство имен CSharp8NewFeatures ; интерфейс ILogger { // Традиционные методы интерфейса void Log ( string message ); void LogError ( Исключение ) ;         // Метод интерфейса по умолчанию void LogWarning ( строковое сообщение ) { Console . WriteLine ( сообщение ); } }       class Logger : ILogger { public void Log ( строковое сообщение ) { Console . WriteLine ( сообщение ); }           public void LogError ( Исключение ) { Console .WriteLine ( исключение . ToString ()); } }      класс Program { static void Main ( string [] args ) { ILogger logger = новый Logger ();            регистратор . LogWarning ( "Некоторое предупреждающее сообщение" ); } } 

PHP

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

// Черта  шаблона TSingleton {  Private  static  $_instance  =  null ; частная  функция  __construct ()  {}  // Должен иметь частный конструктор по умолчанию, и помните, что его нельзя открывать в классе общественная  статическая  функция  getInstance ()  {  if  ( null  ===  self :: $_instance )  {  self :: $_instance  =  new  self ();  } вернуть  себя :: $_instance ;  } }класс  FrontController {  используйте  TSingleton ; }// Также может использоваться в уже расширенных классах class  WebSite  расширяет  SomeClass {  use  TSingleton ; }

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

черта  TBounding {  public  $x ,  $y ,  $width ,  $height ; }черта  TMoveable {  public  function  moveTo ( $x ,  $y )  {  // …  } }типаж  TResizeable {  public  function  resize ( $newWidth ,  $newHeight )  {  // …  } }класс  Rectangle {  use  TBounding ,  TMoveable ,  TResizeable ; публичная  функция  fillColor ( $color )  {  // …  } }

Ржавчина

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

// тип T должен иметь признак "Ord" , // чтобы можно было выполнять операции ">" и "<" fn  max < T : Ord > ( a : & [ T ])  -> Option <& T > { let мут результат = а . первый () ? ; для n в a { if * n > * result { result = & n ; } } Некоторые ( результат ) }                      

Чтобы упростить утомительную и повторяющуюся реализацию таких свойств, как Debugи Ord, deriveмакрос можно использовать для запроса компиляторов автоматически генерировать определенные реализации. [45] К производным признакам относятся: Clone, Copy, Debug, Default, , PartialEq, Eq, PartialOrdи Ord.Hash

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

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

  1. ^ abc Шерли, Натанаэль; Дюкасс, Стефан; Ньерстраз, Оскар ; Блэк, Эндрю П. (2003). «Черты характера: составные единицы поведения» (PDF) . Материалы Европейской конференции по объектно-ориентированному программированию (ECOOP) . Конспекты лекций по информатике. 2743 . Спрингер: 248–274. CiteSeerX  10.1.1.1011.8 . дои : 10.1007/978-3-540-45070-2_12. ISBN 978-3-540-45070-2.
  2. ^ Дюкасс, Стефан; Ньерстраз, Оскар; Шерли, Натанаэль; Вуйтс, Роэл; Блэк, Эндрю П. (март 2006 г.). «Черты: механизм мелкозернистого повторного использования». Транзакции ACM в языках и системах программирования . 28 (2): 331–388. CiteSeerX 10.1.1.64.2480 . дои : 10.1145/1119479.1119483. S2CID  16434119. 
  3. ^ Фишер, Кэтлин ; Реппи, Джон (2003). «Статически типизированные признаки» (PDF) . Чикагский университет . Архивировано (PDF) из оригинала 17 мая 2004 г. {{cite journal}}: Требуется цитировать журнал |journal=( помощь )
  4. ^ Фишер, Кэтлин; Реппи, Джон (2004). Типизированное исчисление признаков (PDF) . 11-й семинар по основам объектно-ориентированного программирования. Чикагский университет .
  5. ^ Карри, Гаэль; Баер, Ларри; Липки, Дэниел; Ли, Брюс (1982). Черты: подход к созданию подклассов с множественным наследованием . Конференция SIGOA по офисным информационным системам. Филадельфия, Пенсильвания, США: ACM Press. стр. 1–9. дои : 10.1145/966873.806468.
  6. ^ Ван Катсем, Том; Бергель, Александр; Дюкасс, Стефан; Де Мойтер, Вольфганг (2009). Добавление контроля состояния и видимости к признакам с использованием лексической вложенности (PDF) . Европейская конференция по объектно-ориентированному программированию (ECOOP 2009). Конспекты лекций по информатике. Том. 5653. Шпрингер-Верлаг. стр. 220–243. CiteSeerX 10.1.1.372.1265 . дои : 10.1007/978-3-642-03013-0_11. ISBN  978-3-642-03012-3.
  7. ^ «Методы интерфейса по умолчанию». Что нового в C# 8.0 . Майкрософт . Проверено 29 ноября 2019 г.
  8. ^ «Интерфейсы в C# 8.0 претерпевают изменения» . Реализация по умолчанию в интерфейсах C# 8.0 . Говоря о Дотнете. 9 сентября 2019 года . Проверено 29 ноября 2019 г.
  9. ^ "iterator_traits<Итератор>". Стандартная библиотека шаблонов . СГИ.
  10. ^ Майерс, Натан К. (июнь 1995 г.). «Черты: новая и полезная техника шаблонов». Отчет С++ . Проверено 23 января 2016 г.
  11. ^ Абрахамс, Дэвид. «Общие методы программирования: особенности». Библиотеки Boost C++ . Проверено 23 января 2016 г.
  12. ^ Стил, Гай; Мессен, Ян-Виллем (11 июня 2006 г.). «Учебник по языку программирования Fortress» (PDF) . Сан Микросистемс . Проверено 23 января 2016 г.
  13. ^ «Объектная ориентация: особенности». Язык программирования Groovy . Проверено 23 января 2016 г.
  14. ^ "Haxe 2.4.0 - Haxe - Кроссплатформенный набор инструментов" . Haxe — кроссплатформенный набор инструментов . Проверено 12 сентября 2017 г.
  15. ^ «Руководство - Haxe - Кроссплатформенный набор инструментов» . Haxe — Кроссплатформенный набор инструментов . Проверено 12 сентября 2017 г.
  16. ^ «Методы по умолчанию». Учебники по Java . Оракул . Проверено 23 января 2016 г.
  17. ^ Ликори, Луиджи; Спивак, Арно (2008). «FeatherTrait: скромное расширение полулегкой Java». Транзакции ACM в языках и системах программирования . 30 (2): 11:1. дои : 10.1145/1330017.1330022 . S2CID  17231803.
  18. ^ Ликори, Луиджи; Спивак, Арно (2008). «Расширение FeatherTrait Java с помощью интерфейсов». Теоретическая информатика . 398 (1–3): 243–260. дои : 10.1016/j.tcs.2008.01.051 . S2CID  12923128.
  19. ^ Боно, Вивиана; Менса, Энрико; Наддео, Марко (сентябрь 2014 г.). Специализированное программирование на Java 8. Международная конференция по принципам и практикам программирования на платформе Java: виртуальные машины, языки и инструменты (PPPJ '14). стр. 181–6. CiteSeerX 10.1.1.902.161 . дои : 10.1145/2647508.2647520. 
  20. Форслунд, Эмиль (3 февраля 2016 г.). «Определение шаблона черт в Java». Эпоха Явы . Архивировано из оригинала 4 августа 2016 года . Проверено 3 февраля 2016 г.
  21. Селигер, Питер (11 апреля 2014 г.). «Множество талантов JavaScript» . Проверено 23 января 2015 г.
  22. ^ «Traits.js: особенности для JavaScript» . Проверено 23 января 2016 г.
  23. ^ Ван Катсем, Том; Миллер, Марк С. (2012). «Надежная композиция признаков для Javascript» (PDF) . Наука компьютерного программирования . Проверено 23 января 2016 г.
  24. ^ "КоктейльJS" . Проверено 23 января 2016 г.
  25. ^ мауро3. "SimpleTraits.jl". Гитхаб . Проверено 23 марта 2017 г.{{cite web}}: CS1 maint: numeric names: authors list (link)
  26. ^ «Интерфейсы». Справочник по Котлину . ДжетБрэйнс . Проверено 23 января 2016 г.
  27. ^ Бреслав, Андрей (29 мая 2015 г.). «Котлин М12 вышел!». Котлин-блог . ДжетБрэйнс . Проверено 23 января 2016 г.
  28. ^ «Черты». Руководство по языку Лассо . ЛассоСофт. 6 января 2014 года . Проверено 23 января 2016 г.
  29. ^ «Модульная документация — журнал изменений Mojo🔥» . docs.modular.com . Проверено 13 декабря 2023 г.
  30. ^ хроматический (30 апреля 2009 г.). «Почему роли Perl» . Проверено 23 января 2016 г.
  31. ^ Кертис «Овидий» По. «Предложение Коринны ООП». Коринна RFC . Проверено 30 сентября 2022 г.
  32. ^ «Черты». PHP-документация . Группа PHP . Проверено 23 января 2016 г.
  33. Марр, Стефан (9 января 2011 г.). «Запрос комментариев: горизонтальное повторное использование PHP». PHP.net вики . Группа PHP . Проверено 31 января 2011 г.
  34. ^ Перя, Теппо. «Документация py3traits» . Проверено 23 января 2016 г.
  35. ^ Перя, Теппо (25 марта 2015 г.). "py2traits". Гитхаб . Проверено 23 января 2016 г.
  36. ^ «Классы миксинов высшего порядка». Архивировано из оригинала 9 октября 2016 г.
  37. ^ «Черты». Справочник по рэкету . Проверено 23 января 2016 г.
  38. Дэвид Нэсби (14 февраля 2004 г.). «Черты Рубина». Руби Нэсби . Проверено 23 января 2016 г.
  39. ^ «Черты». Язык программирования Rust . Проверено 30 сентября 2019 г.
  40. ^ «Черты». Экскурсия по Скале . Федеральная политехническая школа Лозанны . Проверено 23 января 2016 г.
  41. Ньюард, Тед (29 апреля 2008 г.). «Руководство для занятого Java-разработчика по Scala: особенности и поведение». IBM DeveloperWorks . ИБМ . Проверено 23 января 2016 г.
  42. ^ «Черты характера за 10 минут». Фаро: Книга CollaborActive . Проверено 23 января 2016 г.
  43. Холлеманс, Маттейс (22 июля 2015 г.). «Миксины и трейты в Swift 2.0» . Проверено 23 января 2016 г.
  44. ^ «Особенности - Введение в программирование с использованием Rust» .
  45. ^ «Черты — язык программирования Rust» .

Внешние ссылки