Введение

Особенность языка программирования

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

Использование

Абстрактные типы — важная особенность статически типизированных объектно-ориентированных языков программирования. Многие динамически типизированные языки не имеют аналогичной возможности (хотя использование "утиной типизации" делает абстрактные типы излишними), однако "трейты" встречаются в некоторых современных динамически типизированных языках. Некоторые авторы утверждают, что классы должны быть конечными (не иметь подтипов) или же абстрактными. Абстрактные типы полезны тем, что позволяют определять и обеспечивать соблюдение протокола — набора операций, которые должны поддерживать все объекты, реализующие этот протокол. Абстрактные типы также являются ключевой частью шаблона "Шаблонный метод".