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 foreachiterace umožňuje, aby iterovaný objekt byl jakéhokoli typu, pokud implementuje vhodnou GetEnumeratormetodu. (Porovnejte s usingtvrzením, které vyžaduje prostředek k implementaci System.IDisposablerozhraní.)

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 Isplňuje koncept Trivial Iterator v C ++ a ije typu I, jsou to platné výrazy s odpovídající sémantikou:

  • I i výchozí konstrukce.
  • *imusí být konvertibilní na nějaký typ T.
  • i->mje platné, pokud (*i).mje.

Viz také

Reference

externí odkazy