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