Абстрактные типы в программировании: определение, отличие от конкретных типов, реализация через абстрактные классы и интерфейсы. Основы объектно-ориентированного программирования.
Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Введение
Особенность языка программирования
Feature of a programming language
В языках программирования абстрактный тип (также известный как экзистенциальный тип) — это тип в номинативной системе типов, который нельзя инстанцировать напрямую, в отличие от конкретного типа, который можно инстанцировать непосредственно. Инстанцирование абстрактного типа возможно только косвенно, через конкретный подтип. Абстрактный тип может не предоставлять реализацию вообще или предоставлять неполную реализацию. В некоторых языках абстрактные типы без реализации (а не с неполной реализацией) называются протоколами, интерфейсами, сигнатурами или типами классов. В объектно-ориентированном программировании, основанном на классах, абстрактные типы реализуются как абстрактные классы (также известные как абстрактные базовые классы), а конкретные типы — как конкретные классы. В обобщённом программировании аналогичным понятием является концепция, которая также определяет синтаксис и семантику, но не требует отношения подтипа: два несвязанных типа могут соответствовать одной и той же концепции. Часто для абстрактных типов предоставляется одна или несколько реализаций отдельно, например, в виде конкретных подтипов, которые можно инстанцировать. В объектно-ориентированном программировании абстрактный класс может включать абстрактные методы или абстрактные свойства, общие для его подклассов. Другие названия языковых конструкций, которые используются (или могут быть использованы) для реализации абстрактных типов, включают трейты, миксины, флейворы, роли или классы типов. Абстрактные типы также могут включать любое количество неабстрактных методов и свойств, например, при реализации шаблона метода, который использует сочетание инвариантных методов с фиксированной реализацией и методов-заглушек, которые могут быть переопределены в конкретных подклассах для предоставления специализированной логики.
In programming languages, an abstract type (also known as existential types) is a type in a nominative type system that cannot be instantiated directly; by contrast, a concrete type can be instantiated directly. Instantiation of an abstract type can occur only indirectly, via a concrete subtype. An abstract type may provide no implementation, or an incomplete implementation. In some languages, abstract types with no implementation (rather than an incomplete implementation) are known as protocols, interfaces, signatures, or class types. In class based object oriented programming, abstract types are implemented as abstract classes (also known as abstract base classes), and concrete types as concrete classes. In generic programming, the analogous notion is a concept, which similarly specifies syntax and semantics, but does not require a subtype relationship: two unrelated types may satisfy the same concept. Often, abstract types will have one or more implementations provided separately, for example, in the form of concrete subtypes that can be instantiated. In object oriented programming, an abstract class may include abstract methods or abstract properties that are shared by its subclasses. Other names for language features that are (or may be) used to implement abstract types include traits, mixins, flavors, roles, or type classes. Abstract types may also include any number of non abstract methods and properties, such as when implementing the Template Method Pattern which uses a mixture of invariant methods with fixed implementations and hook methods which can be overridden in concrete subclasses to provide custonised logic.
Использование
Абстрактные типы — важная особенность статически типизированных объектно-ориентированных языков программирования. Многие динамически типизированные языки не имеют аналогичной возможности (хотя использование "утиной типизации" делает абстрактные типы излишними), однако "трейты" встречаются в некоторых современных динамически типизированных языках. Некоторые авторы утверждают, что классы должны быть конечными (не иметь подтипов) или же абстрактными. Абстрактные типы полезны тем, что позволяют определять и обеспечивать соблюдение протокола — набора операций, которые должны поддерживать все объекты, реализующие этот протокол. Абстрактные типы также являются ключевой частью шаблона "Шаблонный метод".
Abstract types are an important feature in statically typed OOP languages. Many dynamically typed languages have no equivalent feature (although the use of duck typing makes abstract types unnecessary); however traits are found in some modern dynamically typed languages. Some authors argue that classes should be leaf classes (have no subtypes), or else be abstract. Abstract types are useful in that they can be used to define and enforce a protocol; a set of operations that all objects implementing the protocol must support. Abstract types are also an essential part of the Template Method Pattern.