Абстрактный тип
Эта статья нуждается в дополнительных цитатах для проверки . ( январь 2022 г. ) |
Типовые системы |
---|
Общие понятия |
Основные категории |
Второстепенные категории |
В языках программирования — абстрактный тип (также известный как экзистенциальный тип ). [1] — это тип в системе номинативных типов , экземпляр которого не может быть создан напрямую; напротив, конкретный тип может быть создан напрямую. Создание экземпляра абстрактного типа может происходить только косвенно, через конкретный подтип .
Абстрактный тип может не обеспечивать никакой реализации или обеспечивать неполную реализацию. В некоторых языках абстрактные типы без реализации (а не неполная реализация) известны как протоколы , интерфейсы , сигнатуры или типы классов . В на основе классов объектно-ориентированном программировании абстрактные типы реализуются как абстрактные классы (также известные как абстрактные базовые классы ), а конкретные типы — как конкретные классы . В обобщенном программировании аналогичным понятием является понятие , которое аналогичным образом определяет синтаксис и семантику, но не требует отношения подтипа: два несвязанных типа могут удовлетворять одному и тому же понятию.
Часто абстрактные типы имеют одну или несколько реализаций, предоставляемых отдельно, например, в форме конкретных подтипов, экземпляры которых могут быть созданы. В объектно-ориентированном программировании абстрактный класс может включать абстрактные методы или абстрактные свойства. [2] которые являются общими для его подклассов. Другие названия языковых функций, которые используются (или могут использоваться) для реализации абстрактных типов, включают в себя типажи , примеси , разновидности , роли или классы типов . [ нужна ссылка ]
Абстрактные типы могут также включать любое количество неабстрактных методов и свойств, например, при реализации шаблона метода шаблона , который использует смесь инвариантных методов с фиксированными реализациями и методы-перехватчики , которые можно переопределить в конкретных подклассах для обеспечения индивидуальной логики.
Создание [ править ]
Абстрактные классы можно создавать, обозначать или моделировать несколькими способами:
- С помощью явного ключевого слова
abstract
в определении класса, как в Java , D или C# . - Путем включения в определение класса одного или нескольких абстрактных методов (называемых чистыми виртуальными функциями в C++ ), которые, как объявлено, класс принимает как часть своего протокола, но для которых не предусмотрена реализация.
- Наследуя . абстрактный тип и не переопределяя все недостающие функции, необходимые для завершения определения класса Другими словами, дочерний тип, который не реализует все абстрактные методы своего родителя, сам становится абстрактным. [2] [3]
- Во многих динамически типизированных языках, таких как Smalltalk , любой класс, который отправляет определенный метод в this , но не реализует этот метод, может считаться абстрактным. (Однако во многих таких языках, таких как Objective-C , ошибка не обнаруживается до тех пор, пока не будет использован класс, и сообщение возвращает результат в виде сообщения об ошибке исключения, такого как «Не распознает селектор: xxx», как
- [NSObject doesNotRecognizeSelector:(SEL)selector]
вызывается при обнаружении нереализованного метода).
Примеры [ править ]
Ява [ править ]
По умолчанию все методы во всех классах являются конкретными, если не используется ключевое слово Abstract. Абстрактный класс может включать в себя абстрактные методы, не имеющие реализации. По умолчанию все методы во всех интерфейсах являются абстрактными, если не используется ключевое слово default. Ключевое слово по умолчанию можно использовать для указания конкретного метода в интерфейсе.
//By default, all methods in all classes are concrete, unless the abstract keyword is used.
public abstract class Demo {
// An abstract class may include abstract methods, which have no implementation.
public abstract int sum(int x, int y);
// An abstract class may also include concrete methods.
public int product(int x, int y) {
return x*y;
}
}
//By default, all methods in all interfaces are abstract, unless the default keyword is used.
interface DemoInterface {
int getLength(); //The abstract keyword can be used here, though is completely useless
//The default keyword can be used in this context to specify a concrete method in an interface
default int product(int x, int y) {
return x * y;
}
}
Использование [ править ]
Абстрактные типы — важная особенность статически типизированных языков ООП. Многие динамически типизированные языки не имеют эквивалентной функции (хотя использование утиной типизации делает ненужными абстрактные типы); однако черты встречаются в некоторых современных динамически типизированных языках. [ нужна ссылка ]
Некоторые авторы утверждают, что классы должны быть листовыми (не иметь подтипов) или быть абстрактными. [4] [5]
Абстрактные типы полезны тем, что их можно использовать для определения и реализации протокола ; набор операций, которые должны поддерживать все объекты, реализующие протокол. [ нужна ссылка ]
Абстрактные типы также являются важной частью шаблона метода шаблона .
См. также [ править ]
Ссылки [ править ]
- ^ Митчелл, Джон К.; Плоткин, Гордон Д.; Абстрактные типы имеют экзистенциальный тип , Транзакции ACM в языках и системах программирования, Vol. 10, № 3, июль 1988 г., стр. 470–502.
- ^ Jump up to: а б «Абстрактные методы и классы (Учебные пособия по Java > Изучение языка Java > Интерфейсы и наследование)» . Oracle.com . Проверено 14 августа 2019 г.
- ^ «Чистые виртуальные функции и абстрактные классы в C++» . GeeksforGeeks.org . 15 июля 2014 г.
- ^ Риэль, Артур (1996). Эвристика объектно-ориентированного проектирования . Аддисон-Уэсли Профессионал. п. 89. ИСБН 0-201-63385-Х .
- ^ Мейерс, Скотт (1996). Более эффективный C++ . Аддисон-Уэсли Профессионал. п. 258 . ISBN 0-201-63371-Х .
Сделать неконечные классы абстрактными
Дальнейшее чтение [ править ]
- Head First Java . О'Рейли Медиа. 2003. С. 688 . ISBN 0-596-00920-8 .
- Core Java: интегрированный подход Р. Нагешвара Рао
Внешние ссылки [ править ]
- «Объяснение абстрактных или скелетных интерфейсов» [1]
- Типы и языки программирования Бенджамина Пирса (MIT Press 2002) [2]
- Абстрактный шрифт в Rosetta Code