Русская Википедия:Типаж (абстрактный тип)

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Шаблон:О Типаж (иногда — трейт, черта/особенность поведения, нрав, от Шаблон:Lang-en) — абстрактный тип данных, используемый как «простая концептуальная модель для структурирования объектно-ориентированных программ»[1]Шаблон:Уточнить. Понятие появилось вследствие конфликтов при использовании классов в ООП для наследования. Схож по решаемым проблемам при наследовании с интерфейсами и примесями и, в отличие от которых, содержит только методы. Также специфичны способом разрешения конфликтов — типажи не допускают совпадения названий методов. Первоначально концепция разработана в группе структурного проектирования программного обеспечения Бернского университета[2].

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

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

Пример на 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
    }
}

Примечания

Шаблон:Примечания

Ссылки

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

Шаблон:Rq

  1. Ошибка цитирования Неверный тег <ref>; для сносок web.cecs.pdx.edu1 не указан текст
  2. Ошибка цитирования Неверный тег <ref>; для сносок scg.unibe.ch2 не указан текст
  3. Ошибка цитирования Неверный тег <ref>; для сносок scala-lang.org3 не указан текст
  4. Ошибка цитирования Неверный тег <ref>; для сносок ibm4 не указан текст
  5. Ошибка цитирования Неверный тег <ref>; для сносок php.net5 не указан текст