Концепция (общее программирование) - Concept (generic programming)
В общее программирование, а концепция это описание поддерживаемых операций над типом, включая синтаксис и семантику. Таким образом, концепции связаны с абстрактные типы но понятия не требуют отношения подтипа.
Использование языка
Этот термин использовался еще в 1998 г. STL,[1] поскольку это была одна из первых библиотек, широко использовавших шаблоны. Период, термин концепция (и его популяризация) приписывают Александр Степанов,[2][3] главный разработчик STL.
в C ++ Стандарт 1998 г. Концепция термин был введен для обозначения простого описания требований для определенного типа, обычно являющегося параметром шаблона. Он не был закодирован в языке явно - концепция выражалась только в том, какие операции предпринимаются с объектами этого типа и что ожидается, чтобы работать (то есть правильно скомпилировать). Было предложение добавить концепции как явная языковая особенность в C ++ 11, хотя было отклонено как «не готово».
Как дженерики в Ява и C # имеют некоторое сходство с C ++ шаблоны, роль понятий здесь играет интерфейсы. Однако есть одно важное различие между концепциями и интерфейсами: когда параметр шаблона требуется для реализации определенного интерфейса, соответствующий тип может быть только классом, который реализует (явно) этот интерфейс. Концепции приносят большую гибкость, потому что их можно удовлетворить двумя способами:
- явно определен как удовлетворенный с помощью карты понятий (определяется отдельно от самого типа, в отличие от интерфейсов)
- неявно определен для "автоматических концепций", которые также могут использоваться для встроенных типов и других типов, которые не были предназначены для этого использования
Но в языке C # есть несколько конструкций, в которых используемый тип не требует явной реализации определенного интерфейса, требуется только соответствие соответствующему шаблону (однако эти шаблоны не вызываются концепции). Например. то для каждого
Оператор итерации позволяет итерируемому объекту быть любого типа, если он реализует соответствующий GetEnumerator
метод.[4] (Сравните с с помощью
оператор, который требует ресурса для реализации System.IDisposable
интерфейс.[5])
Другой язык, реализующий нечто очень похожее на концепции, - это Haskell, где функция называется типовые классы.
пример
Например, если тип я
удовлетворяет концепции Trivial Iterator в C ++, и я
относится к типу я
, следующие допустимые выражения с соответствующей семантикой:[6]
Я я
конструкция по умолчанию.*я
должен быть преобразован в какой-то типТ
.я-> м
действительно, если(*я
является.
Смотрите также
использованная литература
- ^ Остерн, М. Общее программирование и STL: использование и расширение стандартной библиотеки шаблонов C ++. 1998. С. 17–18.
- ^ немного основы для концепций и C ++ 17 - Бьярн Страуструп, Бьярн Страуструп | 26 февраля 2016 г.
- ^ Алексей Степанов, Бьярн Страуструп | 21 янв.2016 г.
- ^ Проект спецификации C # 6.0, Заявление foreach
- ^ Проект спецификации C # 6.0, Оператор using
- ^ Тривиальный итератор