Типаж (абстрактный тип): различия между версиями

Материал из Поле цифровой дидактики
м 1 версия импортирована
Нет описания правки
 
Строка 1: Строка 1:
{{о|типаже (характеристике, трейте) в программировании|типаже в театре|сценический характер|других значения термина «характеристика»|характеристика}}
'''Типаж''' (иногда — ''трейт,'' черта/''особенность поведения'', нрав, от {{lang-en|trait}}) — [[абстрактный тип данных]], используемый как «простая концептуальная модель для структурирования [[Объектно-ориентированное программирование|объектно-ориентированных]] программ»<ref>{{Cite web |url=http://web.cecs.pdx.edu/~black/publications/TR_CSE_02-012.pdf |title=Источник |access-date=2009-08-04 |archive-date=2017-08-09 |archive-url=https://web.archive.org/web/20170809134035/http://web.cecs.pdx.edu/~black/publications/TR_CSE_02-012.pdf |deadlink=no }}</ref>{{Уточнить}}<!-- это не определение, а только характеристика…-->. Понятие появилось вследствие конфликтов при использовании [[Класс (программирование)|классов в ООП]] для наследования. Схож по решаемым проблемам при наследовании с [[Интерфейс (объектно-ориентированное программирование)|интерфейсами]] и [[Примесь (программирование)|примесями]] и, в отличие от которых, содержит только [[Метод (объектно-ориентированное программирование)|методы]]. Также специфичны способом разрешения конфликтов — типажи не допускают совпадения названий методов. Первоначально концепция разработана в группе структурного проектирования программного обеспечения [[Бернский университет|Бернского университета]]<ref>{{Cite web |url=http://scg.unibe.ch/cgi-bin/scgbib.cgi?query=nathanael+traits+composable+units+ecoop |title=SCG: SCG Bibliography<!-- Заголовок добавлен ботом --> |access-date=2009-08-04 |archive-date=2009-05-04 |archive-url=https://web.archive.org/web/20090504002137/http://scg.unibe.ch/cgi-bin/scgbib.cgi?query=nathanael+traits+composable+units+ecoop |deadlink=no }}</ref>.


Являются основой языка [[Rust (язык программирования)|Rust]] и встроены в язык [[Scala (язык программирования)|Scala]]<ref>http://www.scala-lang.org/node/126 {{Wayback|url=http://www.scala-lang.org/node/126 |date=20090927080703 }} A Tour of Scala: Traits</ref>
'''Типаж''' (иногда — ''трейт,'' черта/''особенность поведения'', нрав, [[абстрактный тип данных]], используемый как «простая концептуальная модель для структурирования [[Объектно-ориентированное программирование|объектно-ориентированных]] программ»
<ref>http://www.ibm.com/developerworks/java/library/j-scala04298.html {{Wayback|url=http://www.ibm.com/developerworks/java/library/j-scala04298.html |date=20090826151357 }} The busy Java developer’s guide to Scala: Of traits and behaviors</ref>, в вариант [[Squeak]] языка [[Smalltalk]] включены с версии 3.9, введены в [[Perl 6]] (где они называются «роли»; для Perl 5 — реализованы как модуль в [[Moose (Perl)|Moose]]), введены в язык [[C Sharp|C#]] 8.0 (где они называются интерфейсы с реализацией методов по умолчанию), также реализованы во фреймворке [[Joose]] для [[JavaScript]]. Также планируется включение типажей в [[ActionScript|ActionScript 3.0]]. Модульные примеси (''module mixins'') в [[Ruby]] в некоторой степени похож на типажи.


В некоторых языках программирования типажами называют типы, которые на самом деле являются примесями. Так, например, в [[PHP]] типажи могут содержать не только методы, но и [[Свойства объекта|свойства]]<ref>{{Cite web|url=http://php.net/manual/ru/language.oop5.traits.php#language.oop5.traits.properties|title=PHP: Трейты - Manual|publisher=php.net|lang=ru|accessdate=2017-03-15|archive-date=2017-03-14|archive-url=https://web.archive.org/web/20170314202244/http://php.net/manual/ru/language.oop5.traits.php#language.oop5.traits.properties|deadlink=no}}</ref>.
Понятие появилось вследствие конфликтов при использовании [[Класс (программирование)|классов в ООП]] для наследования. Схож по решаемым проблемам при наследовании с [[Интерфейс (объектно-ориентированное программирование)|интерфейсами]] и [[Примесь (программирование)|примесями]] и, в отличие от которых, содержит только [[Метод (объектно-ориентированное программирование)|методы]]. Также специфичны способом разрешения конфликтов — типажи не допускают совпадения названий методов.  


Пример на [[Rust (язык программирования)|Rust]] для существующего типа, описывающего хеширование:
Являются основой языка [[Rust (язык программирования)|Rust]] и встроены в язык [[Scala (язык программирования)|Scala]], в вариант [[Squeak]] языка [[Smalltalk]] включены с версии 3.9, введены в [[Perl]] 6 (где они называются «роли»; для Perl 5 — реализованы как модуль в [[Moose (Perl)|Moose]]), введены в язык [[C Sharp|C#]] 8.0 (где они называются интерфейсы с реализацией методов по умолчанию), также реализованы во фреймворке [[Joose]] для [[JavaScript]]. Также планируется включение типажей в [[ActionScript|ActionScript 3.0]].
 
В некоторых языках программирования типажами называют типы, которые на самом деле являются примесями. Так, например, в [[PHP]] типажи могут содержать не только методы, но и [[Свойства объекта|свойства]]
 
 
 
Пример на [[Rust]] для существующего типа, описывающего хеширование:
<syntaxhighlight lang="rust">
<syntaxhighlight lang="rust">
trait Hash {
trait Hash {
Строка 29: Строка 32:
</syntaxhighlight>
</syntaxhighlight>


== Примечания ==
{{примечания}}
== Ссылки ==
* [http://www.iam.unibe.ch/~scg/Research/Traits/ Traits]
* [http://citeseer.ist.psu.edu/566972.html Traits: Composable Units of Behavior]
{{rq|style}}
{{Типы данных}}
{{rq|sources|refless|stub|topic=ИТ}}


[[Категория:Типы данных]]
[[Категория:Структуры данных]]
[[Категория:Структуры данных]]
[[Категория:Теория типов]]

Текущая версия от 11:49, 19 октября 2022

Типаж (иногда — трейт, черта/особенность поведения, нрав, — абстрактный тип данных, используемый как «простая концептуальная модель для структурирования объектно-ориентированных программ»

Понятие появилось вследствие конфликтов при использовании классов в ООП для наследования. Схож по решаемым проблемам при наследовании с интерфейсами и примесями и, в отличие от которых, содержит только методы. Также специфичны способом разрешения конфликтов — типажи не допускают совпадения названий методов. 

Являются основой языка Rust и встроены в язык Scala, в вариант Squeak языка Smalltalk включены с версии 3.9, введены в Perl 6 (где они называются «роли»; для Perl 5 — реализованы как модуль в Moose), введены в язык C# 8.0 (где они называются интерфейсы с реализацией методов по умолчанию), также реализованы во фреймворке Joose для JavaScript. Также планируется включение типажей в ActionScript 3.0.

В некоторых языках программирования типажами называют типы, которые на самом деле являются примесями. Так, например, в PHP типажи могут содержать не только методы, но и свойства


Пример на Rust для существующего типа, описывающего хеширование:

trait Hash {
    fn hash(&self) -> u64;
}

Реализация типажа Hash для какого-либо типа — примеры методов hash с соответствующей сигнатурой:

impl Hash for bool {
    fn hash(&self) -> u64 {
        if *self { 0 } else { 1 }
    }
}

impl Hash for i64 {
    fn hash(&self) -> u64 {
        *self as u64
    }
}