В языках программирования, абстрактный тип- это тип в системе номинативного типа, который не может быть напрямую создан ; тип, который не является абстрактным, который может быть создан, называется конкретным типом. Каждый экземпляр абстрактного типа является экземпляром некоторого конкретного подтипа. Абстрактные типы также известны как экзистенциальные типы.
Абстрактный тип может не обеспечивать реализации или обеспечивать неполную реализацию. В некоторых языках абстрактные типы без реализации (а не с неполной реализацией) известны как протоколы, интерфейсы, сигнатуры или типы классов. В на основе классов объектно-ориентированного программирования абстрактные типы реализуются как абстрактные классы (также известные как абстрактные базовые классы ), а конкретные типы как бетонные классы. В универсальном программировании аналогичным понятием является концепция , которая аналогичным образом определяет синтаксис и семантику, но не требует отношения подтипов: два несвязанных типа могут удовлетворять одной концепции.
Часто абстрактные типы имеют одну или несколько реализаций, предоставляемых отдельно, например, в форме конкретных подтипов, экземпляры которых могут быть созданы. В объектно-ориентированном программировании абстрактный класс может включать в себя абстрактные методы или абстрактные свойства, общие для его подклассов. Другие имена языковых функций, которые используются (или могут использоваться) для реализации абстрактных типов, включают черты, миксины, разновидности, роли или классы типов.
Абстрактные классы могут быть созданы, обозначены или смоделированы несколькими способами:
- [NSObject doesNotRecognizeSelector: (SEL) selector]
вызывается при обнаружении нереализованного метода).// По умолчанию все методы во всех классах являются конкретными, если не используется ключевое слово abstract. abstract class Demo {// Абстрактный класс может включать абстрактные методы, у которых нет реализации. абстрактная публичная int sum (int x, int y); // Абстрактный класс может также включать в себя конкретные методы. общедоступный продукт int (int x, int y) {return x * y; }} // По умолчанию все методы во всех интерфейсах являются абстрактными, если не используется ключевое слово default. интерфейс DemoInterface {[аннотация] int getLength (); // Здесь можно использовать абстракцию, но она совершенно бесполезна // В этом контексте можно использовать ключевое слово по умолчанию для указания конкретного метода в интерфейсе по умолчанию int product (int x, int y) {return x * y; }}
Абстрактные типы - важная особенность статически типизированных языков ООП. Многие языки с динамической типизацией не имеют эквивалентной функции (хотя использование утиной печати делает ненужными абстрактные типы); однако черты встречаются в некоторых современных языках с динамической типизацией.
Некоторые авторы утверждают, что классы должны быть листовыми классами (не иметь подтипов) или же быть абстрактными.
Абстрактные типы полезны тем, что их можно использовать для определения и обеспечения соблюдения протокола ; набор операций, которые должны поддерживать все объекты, реализующие протокол.
Абстрактные типы также являются неотъемлемой частью Шаблон метода шаблона.