Koncept (generické programování) - Concept (generic programming)
V obecném programování je koncept popisem podporovaných operací na typu, včetně syntaxe a sémantiky. Tímto způsobem se koncepty vztahují k abstraktním typům, ale koncepty nevyžadují vztah podtypu.
Používání jazyka
Termín byl používán již v roce 1998 pro STL , protože to byla jedna z prvních knihoven, které široce používaly šablony. Termín koncept (a jeho popularizace) je připisován Alexandru Stepanovovi , primárnímu konstruktérovi STL.
Ve standardu C ++ 1998 byl termín Concept zaveden tak, aby pojmenoval pouze jednoduchý popis požadavků pro konkrétní typ, obvykle jako parametr šablony. Nebylo to kódováno v jazyce explicitně - koncept byl vyjádřen pouze tím, jaké operace jsou prováděny na objektech tohoto typu a co se očekává, že bude fungovat (tj. Správně kompilovat). Byl předložen návrh na přidání konceptů jako explicitní jazykové funkce v C ++ 11 , i když byl odmítnut jako „není připraven“. C ++ 20 nakonec přijal vytříbený design konceptu.
Protože generika v Javě a C# mají určité podobnosti se šablonami C ++ , roli konceptů zde hrají rozhraní . Mezi koncepty a rozhraními je však jeden důležitý rozdíl: když je k implementaci konkrétního rozhraní vyžadován parametr šablony, typem shody může být pouze třída, která toto rozhraní implementuje (výslovně). Koncepty přinášejí větší flexibilitu, protože je lze uspokojit dvěma způsoby:
- výslovně definováno jako splněné pomocí koncepční mapy (definováno samostatně pro samotný typ, na rozdíl od rozhraní)
- implicitně definováno pro „automatické koncepty“, které lze použít také pro vestavěné typy a jiné typy, které pro toto použití nebyly předurčeny
Ale jazyk C# má několik konstruktů, kde použitý typ nepotřebuje explicitně implementovat definované rozhraní, je pouze nutné, aby odpovídal příslušnému vzoru (tyto vzory se však nenazývají koncepty ). Například příkaz foreach
iterace umožňuje, aby iterovaný objekt byl jakéhokoli typu, pokud implementuje vhodnou GetEnumerator
metodu. (Porovnejte s using
tvrzením, které vyžaduje prostředek k implementaci System.IDisposable
rozhraní.)
Dalším jazykem implementujícím něco velmi podobného konceptům je Haskell , kde se tato funkce nazývá typové třídy .
Příklad
Pokud například typ I
splňuje koncept Trivial Iterator v C ++ a i
je typu I
, jsou to platné výrazy s odpovídající sémantikou:
-
I i
výchozí konstrukce. -
*i
musí být konvertibilní na nějaký typT
. -
i->m
je platné, pokud(*i).m
je.