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

Материал из Поле цифровой дидактики
Спасено источников — 5, отмечено мёртвыми — 0. Сообщить об ошибке. См. FAQ.) #IABot (v2.0.8.9
 
м 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
    }
}

Примечания

1 }}
       | {{#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» не существует.

Ссылки

Шаблон:Rq

Шаблон:Типы данных Шаблон:Rq