Типаж (абстрактный тип): различия между версиями
Спасено источников — 5, отмечено мёртвыми — 0. Сообщить об ошибке. См. FAQ.) #IABot (v2.0.8.9 |
Patarakin (обсуждение | вклад) м 1 версия импортирована |
(нет различий)
| |
Версия от 10:30, 19 октября 2022
Шаблон:О Типаж (иногда — трейт, черта/особенность поведения, нрав, от Шаблон:Lang-en) — абстрактный тип данных, используемый как «простая концептуальная модель для структурирования объектно-ориентированных программ»<ref>Шаблон:Cite web</ref>Шаблон:Уточнить. Понятие появилось вследствие конфликтов при использовании классов в ООП для наследования. Схож по решаемым проблемам при наследовании с интерфейсами и примесями и, в отличие от которых, содержит только методы. Также специфичны способом разрешения конфликтов — типажи не допускают совпадения названий методов. Первоначально концепция разработана в группе структурного проектирования программного обеспечения Бернского университета<ref>Шаблон:Cite web</ref>.
Являются основой языка Rust и встроены в язык Scala<ref>http://www.scala-lang.org/node/126 Шаблон:Wayback A Tour of Scala: Traits</ref> <ref>http://www.ibm.com/developerworks/java/library/j-scala04298.html Шаблон:Wayback The busy Java developer’s guide to Scala: Of traits and behaviors</ref>, в вариант Squeak языка Smalltalk включены с версии 3.9, введены в Perl 6 (где они называются «роли»; для Perl 5 — реализованы как модуль в Moose), введены в язык C# 8.0 (где они называются интерфейсы с реализацией методов по умолчанию), также реализованы во фреймворке Joose для JavaScript. Также планируется включение типажей в ActionScript 3.0. Модульные примеси (module mixins) в Ruby в некоторой степени похож на типажи.
В некоторых языках программирования типажами называют типы, которые на самом деле являются примесями. Так, например, в PHP типажи могут содержать не только методы, но и свойства<ref>Шаблон:Cite web</ref>.
Пример на 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
}
}
Примечания
| {{#switch: {{{1}}}
| узкие = columns reflist-narrow
| широкие = columns reflist-wide
| #default = columns
}}
| {{#switch: {{{1}}}
| 1 =
| 2 | 3 = columns
| #default = columns reflist-narrow
}}
}}
| columns
}}
}}" style="{{#if:
| column-width:{{{colwidth}}};
| {{#if:
| {{#iferror: {{#ifexpr: {{{1}}} > 1 }}
| {{#switch: {{{1}}}
| узкие | широкие =
| #default = column-width:{{{1}}};
}}
}}
}}
}} list-style-type: {{#switch:
| upper-alpha
| upper-roman
| lower-alpha
| lower-greek
| lower-roman = {{{group}}}
| #default = decimal
}};">
<references group="" responsive="{{#if:
| 0
| {{#if:
| {{#iferror: {{#expr: {{{1}}} > 1 }}
| {{#switch: {{{1}}}
| узкие | широкие = 1
| #default = 0
}}
| {{#switch: {{{1}}}
| 1 = 0
| #default = 1
}}
}}
| 1
}}
}}"></references>Ошибка скрипта: Модуля «Check for unknown parameters» не существует.
