Rys (počítačové programování) - Trait (computer programming) - Wikipedia
![]() | tento článek může být pro většinu čtenářů příliš technická na to, aby je pochopili.Březen 2012) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) ( |
v programování, a vlastnost je koncept používaný v objektově orientované programování, což představuje sadu metody které lze použít k rozšíření funkčnosti a třída.[1][2]
Vlastnosti
Rysy poskytují sadu metod, které implementují chování třídy, a vyžadují, aby třída implementovala sadu metod, které parametrizovat poskytované chování.
Pro komunikaci mezi objekty jsou vlastnosti někde mezi objektově orientovanými protokol (rozhraní) a a mixin. Rozhraní může definovat jedno nebo více chování prostřednictvím podpisy metod, zatímco vlastnost definuje chování prostřednictvím úplných definic metod: tj. zahrnuje tělo metod. Naproti tomu mixiny zahrnují úplné definice metod a mohou také nést Stát prostřednictvím členské proměnné, zatímco vlastnosti obvykle ne.
Proto je objekt definovaný jako vlastnost vytvořen jako složení metod, které mohou používat jiné třídy bez nutnosti vícenásobné dědictví. V případě a kolize pojmenování, když více než jeden znak, který má třída používat, má metodu se stejným názvem, musí programátor explicitně disambiguovat, která z těchto metod bude ve třídě použita; tedy ruční řešení diamantový problém vícenásobného dědictví. To se liší od ostatních metod kompozice v objektově orientovaném programování, kde jsou konfliktní názvy automaticky řešeny pravidla pro stanovení rozsahu.
Zatímco mixiny lze skládat pouze pomocí dědictví operace, vlastnosti nabízejí mnohem širší výběr operací, včetně:[3][4]
- symetrický součet: operace, která sloučí dva nesouvislé znaky a vytvoří nový znak
- přepsat (nebo asymetrický součet): operace, která tvoří nový znak přidáním metod k existujícímu znaku, což může přepsat některé z jeho metod
- alias: operace, která vytvoří nový znak přidáním nového názvu pro existující metodu
- vyloučení: operace, která vytvoří nový znak odstraněním metody z existujícího znaku. (V kombinaci s aliasovou operací se získá a mělké přejmenování úkon).
Vlastnosti se skládají následujícími způsoby:
- Složení vlastností je komutativní; na pořadí přidávání vlastností nezáleží. Například daný znak S = A + B, pak vlastnost T = B + A je stejné jako S.
- Konfliktní metody jsou ze složení vyloučeny.
- Vnořené znaky jsou ekvivalentní zploštělým znakům; hierarchie složení neovlivňuje chování vlastností. Například daný znak S = A + X, kde X = B + C, pak vlastnost T = A + B + C je stejné jako S.[1]
Podporované jazyky
Vlastnosti pocházejí původně z programovacího jazyka Já[5] a jsou podporovány následujícími programovacími jazyky:
- AmbientTalk: Kombinuje vlastnosti vlastních vlastností (vícenásobné dědičnosti založené na objektech) a Pokec je Kvičet vlastnosti (vyžadující explicitní složení vlastností programátorem). Staví na výzkumu stavový a zmrazitelné vlastnosti pro povolení stavu uvnitř vlastností, což nebylo povoleno v prvních definicích.[6]
- C#: Od verze 8.0 má C # podporu pro výchozí metody rozhraní,[7] které mají některé vlastnosti vlastností.[8]
- C ++: Použito v Standardní knihovna šablon a C ++ standardní knihovna podporovat obecné třídy kontejnerů[9][10] a v Zvýšit Knihovna TypeTraits.[11]
- Kučera: Abstraktní třídy, protože mixiny umožňují implementaci metody, a tak tvoří znaky pod jiným názvem.[Citace je zapotřebí ]
- D: Od verze 2.003 rozšíření jazyka __traits[12] a modul std.traits[13] pomocné šablony poskytují vlastnosti při kompilaci. Spolu s dalšími jazykovými funkcemi (zejména šablonami a mixiny) umožňují flexibilní automatické generování metod založených na rozhraních a typech. D také umožňuje explicitní aliasing členských metod a proměnných, včetně předávání do více členských tříd.[14]
- Pevnost[15]
- Báječný: Od verze 2.3[16]
- Haskell: V Haskellu jsou vlastnosti známé jako Zadejte třídy.
- Haxe: Od verze 2.4.0.[17] Volala Statické rozšíření[18] v příručce používá
použitím
klíčové slovo - Jáva: Od verze 8 má Java podporu pro výchozí metody,[19] které mají některé vlastnosti vlastností.[20][21]
- JavaScript: Vlastnosti lze implementovat pomocí funkcí a delegací[22] nebo prostřednictvím knihoven, které poskytují vlastnosti.[23][24][25]
- Julie: Několik balíčků implementuje vlastnosti, např.[26]
- Kotlin: Byly povolány rysy rozhraní[27] od M12.[28]
- Laso[29]
- OCaml: Vlastnosti lze implementovat pomocí různých jazykových funkcí: zařazení modulu a typu modulu, funktory a typy funktorů, dědičnost třídy a typu třídy atd.
- Perl: Volala role, jsou implementovány v knihovnách Perlu, jako např Los, Role :: Drobné a Role :: Základní. Role jsou součástí sesterského jazyka Raku.[30]
- PHP: Od verze 5.4,[31][32] PHP umožňuje uživatelům specifikovat šablony, které poskytují možnost „dědit“ z více než jedné (zvláštnosti) třídy jako pseudo vícenásobné dědictví.
- Krajta: Prostřednictvím knihovny třetí strany,[33][34] nebo prostřednictvím tříd mixinů vyššího řádu[35]
- Raketa: Podporuje vlastnosti jako knihovna a k jejich implementaci používá makra, struktury a prvotřídní třídy.[36]
- Rubín: Modulové mixiny lze použít k implementaci vlastností.[37]
- Rez[38]
- Scala[39][40] vlastnost je integrována podporována klíčovým slovem
vlastnost
. - Pokec: Vlastnosti jsou implementovány ve dvou dialektech Smalltalku, Kvičet[1] a Pharo.[41]
- Rychlý: Vlastnosti lze implementovat pomocí rozšíření protokolu.[42]
Příklady
C#
V C # 8.0 je možné definovat implementaci jako člena rozhraní.
použitím Systém;jmenný prostor CSharp8NewFeatures{ rozhraní ILogger { // Tradiční metody rozhraní prázdnota Log(tětiva zpráva); prázdnota LogError(Výjimka výjimka); // Výchozí metoda rozhraní prázdnota LogWarning(tětiva zpráva) { Řídicí panel.WriteLine(zpráva); } } třída Logger : ILogger { veřejnost prázdnota Log(tětiva zpráva) { Řídicí panel.WriteLine(zpráva); } veřejnost prázdnota LogError(Výjimka výjimka) { Řídicí panel.WriteLine(výjimka.ToString()); } } třída Program { statický prázdnota Hlavní(tětiva[] args) { ILogger záznamník = Nový Logger(); záznamník.LogWarning(„Nějaká varovná zpráva“); } }}
PHP
Tento příklad používá vlastnost k vylepšení dalších tříd:
// Šablonavlastnost TSingleton{ soukromé statický $ _instance = nula; soukromé funkce __postavit() {} // Musí mít soukromý výchozí konstruktor a být si vědom, že jej ve třídě neotevíráte veřejnost statický funkce getInstance() { -li (nula === já::$ _instance) { já::$ _instance = Nový já(); } vrátit se já::$ _instance; }}třída FrontController{ použití TSingleton;}// Lze použít také v již rozšířených třídáchtřída Webová stránka rozšiřuje SomeClass{ použití TSingleton;}
To umožňuje simulovat aspekty vícenásobné dědičnosti:
vlastnost TBounding{ veřejnost $ x, $ r, $ šířka, $ výška;}vlastnost Pohyblivé{ veřejnost funkce Přesunout do($ x, $ r) { // … }}vlastnost ODLIŠNÉ{ veřejnost funkce změnit velikost($ newWidth, $ newVýška) { // … }}třída Obdélník{ použití TBounding, Pohyblivé, ODLIŠITELNÝ; veřejnost funkce vyplň barvu($ barva) { // … }}
Rez
Znak v Rustu deklaruje sadu metod, které musí typ implementovat.[43] Rust kompilátory vyžadují vlastnosti, které mají být vysvětleny, což zajišťuje bezpečnost generika v Rustu.
// typ T musí mít vlastnost „Ord“// aby bylo možné provádět operace „>“ a „<“fn get_max<T: Obj>(A: &[T])-> Volba<&T>{nechatmutvýsledek=A.dostat(0)?;pronvA{-li*n>*výsledek{výsledek=&n;}}Nějaký(výsledek)}
Pro zjednodušení zdlouhavé a opakované implementace vlastností jako Ladit
a Obj
, odvodit
makro lze použít k vyžádání kompilátorů k automatickému generování určitých implementací.[44] Odvozitelné vlastnosti zahrnují: Klonovat
, kopírovat
, Ladit
, Výchozí
, PartialEq
, Rov
, PartialOrd
, Obj
a Hash
.
Viz také
Reference
- ^ A b C Schärli, Nathanael; Ducasse, Stéphane; Nierstrasz, Oscar; Black, Andrew P. (2003). „Vlastnosti: Složené jednotky chování“ (PDF). Sborník příspěvků z Evropské konference o objektově orientovaném programování (ECOOP). Přednášky z informatiky. 2743: 248–274.
- ^ Ducasse, Stéphane; Nierstrasz, Oscar; Schärli, Nathanael; Wuyts, Roel; Black, Andrew P. (březen 2006). "Vlastnosti: Mechanismus pro jemnozrnné opětovné použití". Transakce ACM v programovacích jazycích a systémech. 28 (2): 331–388. doi:10.1145/1119479.1119483.
- ^ Fisher, Kathleen; Reppy, John (2003). „Statically typed traits“ (PDF). University of Chicago. Archivováno (PDF) z původního dne 17. května 2004. Citovat deník vyžaduje
| deník =
(Pomoc) - ^ Fisher, Kathleen; Reppy, John (2004). Zadaný počet znaků (PDF). 11. workshop o základech objektově orientovaného programování. University of Chicago.
- ^ Curry, Gael; Baer, Larry; Lipkie, Daniel; Lee, Bruce (1982). Vlastnosti: Přístup k podtřídě více dědičností. Konference SIGOA o kancelářských informačních systémech. Philadelphia, Pensylvánie, USA: ACM Press. s. 1–9. doi:10.1145/966873.806468.
- ^ Van Cutsem, Tom; Bergel, Alexandre; Ducasse, Stéphane; De Meuter, Wolfgang (2009). Přidání stavu a kontroly viditelnosti k vlastnostem pomocí Lexical Nesting (PDF). Evropská konference o objektově orientovaném programování (ECOOP 2009). Přednášky z informatiky. 5653. Springer-Verlag. str. 220–243. doi:10.1007/978-3-642-03013-0_11. ISBN 978-3-642-03012-3.
- ^ „Výchozí metody rozhraní“. Co je nového v C # 8.0. Microsoft. Citováno 29. listopadu 2019.
- ^ „Rozhraní v C # 8.0 se proměňují“. Výchozí implementace v rozhraních v C # 8.0. Mluvící Dotnet. Citováno 29. listopadu 2019.
- ^ "iterator_traits
" . Standardní knihovna šablon. SGI. - ^ Myers, Nathan C. (červen 1995). „Vlastnosti: nová a užitečná technika šablon“. Zpráva v C ++. Citováno 23. ledna 2016.
- ^ Abrahams, David. „Generic Programming Techniques: Traits“. Zvyšte knihovny C ++. Citováno 23. ledna 2016.
- ^ "Vlastnosti". Referenční příručka jazyka D.. Digitální Mars. Citováno 23. ledna 2016.
- ^ "std.traits". Jazyk D - reference do knihovny. Digitální Mars. Citováno 23. ledna 2016.
- ^ "Třídy". Referenční příručka jazyka D.. Digitální Mars. Citováno 23. ledna 2016.
- ^ Steele, Guy; Maessen, Jan-Willem (11. června 2006). "Výukový programovací program pro pevnost" (PDF). Sun Microsystems. Citováno 23. ledna 2016.
- ^ "Orientace objektu: vlastnosti". Groovy programovací jazyk. Citováno 23. ledna 2016.
- ^ „Haxe 2.4.0 - Haxe - sada nástrojů pro různé platformy“. Haxe - sada nástrojů pro různé platformy. Citováno 2017-09-12.
- ^ „Manual - Haxe - The Cross-platform Toolkit“. Haxe - sada nástrojů pro různé platformy. Citováno 2017-09-12.
- ^ „Výchozí metody“. Výukové programy Java. Věštec. Citováno 23. ledna 2016.
- ^ Bono, Viviana; Mensa, Enrico; Naddeo, Marco (září 2014). Programování zaměřené na vlastnosti v Javě 8. Mezinárodní konference o zásadách a postupech programování na platformě Java: virtuální stroje, jazyky a nástroje (PPPJ ’14). Krakov, Polsko.
- ^ Forslund, Emil (3. února 2016). "Definice Trait Pattern v Javě". Věk Javy. Archivovány od originál 4. srpna 2016. Citováno 3. února 2016.
- ^ Seliger, Peter (11. dubna 2014). „Mnoho talentů JavaScriptu“. Citováno 23. ledna 2015.
- ^ „Traits.js: Traits for JavaScript“. Citováno 23. ledna 2016.
- ^ Van Cutsem, Tom; Miller, Mark S. (2012). „Robustní složení vlastností pro Javascript“ (PDF). Věda o počítačovém programování. Citováno 23. ledna 2016.
- ^ „CocktailJS“. Citováno 23. ledna 2016.
- ^ mauro3. „SimpleTraits.jl“. Citováno 23. března 2017.
- ^ "Rozhraní". Odkaz na Kotlin. JetBrains. Citováno 23. ledna 2016.
- ^ Breslav, Andrey (29. května 2015). „Kotlin M12 je venku!“. Blog společnosti Kotlin. JetBrains. Citováno 23. ledna 2016.
- ^ "Vlastnosti". Lasso Language Guide. LassoSoft. 6. ledna 2014. Citováno 23. ledna 2016.
- ^ chromatický (30. dubna 2009). „Proč role Perla“. Citováno 23. ledna 2016.
- ^ "Vlastnosti". Dokumentace PHP. Skupina PHP. Citováno 23. ledna 2016.
- ^ Marr, Stefan (9. ledna 2011). „Žádost o komentář: Horizontální opětovné použití pro PHP“. PHP.net wiki. Skupina PHP. Citováno 31. ledna 2011.
- ^ Perä, Teppo. "dokumentace py3traits". Citováno 23. ledna 2016.
- ^ Perä, Teppo (2015-03-25). "py2traits". Citováno 23. ledna 2016.
- ^ „Třídy Mixin vyšších řádů“. Archivovány od originál dne 09.10.2016.
- ^ "Vlastnosti". Reference rakety. Citováno 23. ledna 2016.
- ^ David Naseby (14. února 2004). „Rysy v Ruby“. Ruby Naseby. Citováno 23. ledna 2016.
- ^ "Vlastnosti". Programovací jazyk Rust. Citováno 30. září 2019.
- ^ "Vlastnosti". Prohlídka Scaly. École polytechnique fédérale de Lausanne. Citováno 23. ledna 2016.
- ^ Neward, Ted (29. dubna 2008). „Zaneprázdněný průvodce vývojářem Java pro Scalu: O vlastnostech a chování“. IBM developerWorks. IBM. Citováno 23. ledna 2016.
- ^ „Vlastnosti za 10 minut“. Pharo: The CollaborActive Book. Citováno 23. ledna 2016.
- ^ Hollemans, Matthijs (22. července 2015). „Mixiny a vlastnosti v Swift 2.0“. Citováno 23. ledna 2016.
- ^ "Vlastnosti - úvod do programování pomocí Rust".
- ^ „Vlastnosti - programovací jazyk Rust“.
externí odkazy
- „Vlastnosti: Složené jednotky chování“. Skupina pro složení softwaru. University of Bern.