Vlastnost (programování) - Property (programming)
![]() | tento článek ne uvést žádný Zdroje.Dubna 2019) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) ( |
A vlastnictví, v některých objektově orientovaný programovací jazyky, je zvláštní druh třída člen, prostředník ve funkčnosti mezi a pole (nebo datový člen) a metoda. Syntaxe pro čtení a zápis vlastností je jako u polí, ale čtení a zápis vlastností se (obvykle) překládá do 'kariérista ' a 'seřizovač 'volání metody. Syntaxe podobná polím se čte a zapisuje snadněji než mnoho volání metod[Citace je zapotřebí ], přesto to umožňuje vložení volání metody „pod kapotu“ ověření dat, aktivní aktualizace (např. z GUI prvků) nebo implementace toho, co lze nazvat „pouze ke čtení pole ".
Níže uvádíme poučný příklad jazyka C #.
Podpora v jazycích
Mezi programovací jazyky, které podporují vlastnosti, patří ActionScript 3, C#, D, Delphi /Free Pascal, eC, F#, Kotlin, JavaScript, Objektiv C 2.0, Krajta, Scala, Rychlý, Lua, a Visual Basic.
Některé objektově orientované jazyky, například Jáva a C ++, nepodporují vlastnosti a vyžadují, aby programátor definoval dvojici přistupující osoba a mutátor metody místo.[Citace je zapotřebí ]
Oberon-2 poskytuje alternativní mechanismus pomocí příznaků viditelnosti proměnné objektu.[Citace je zapotřebí ]
Jiné jazyky určené pro Virtuální stroj Java, jako Báječný, nativně podporovat vlastnosti.
Zatímco C ++ nemá vlastnosti první třídy, lze je emulovat kvůli přetížení operátora.
Všimněte si také, že některé kompilátory C ++ podporují vlastnosti první třídy (jako příklad kompilátor Microsoft C ++).[Citace je zapotřebí ]
Ve většině jazyků jsou vlastnosti implementovány jako dvojice přístupových / mutátorových metod, ale přistupuje se k nim pomocí stejné syntaxe jako u veřejných polí. Vynecháním metody z dvojice se získá a pouze ke čtení nebo neobvyklé pouze pro zápis vlastnictví.
V některých jazycích bez integrované podpory vlastností lze podobný konstrukt implementovat jako jednu metodu, která vrací nebo mění podkladová data v závislosti na kontextu jeho vyvolání. Takové techniky se používají např. v Perl.[Citace je zapotřebí ]
Některé jazyky (Ruby, Smalltalk) dosahují syntaxe podobné vlastnostem pomocí běžných metod, někdy s omezeným množstvím syntaktický cukr.
Varianty syntaxe
Některé jazyky dodržují zavedené konvence syntaxe pro formální specifikaci a využití vlastností a metod.
Mezi tyto konvence:
- Dotová notace
- Bracket notation
Dotová notace
Následující příklad ukazuje tečkovou notaci v JavaScriptu.
dokument.createElement('před');
Bracket notation
Následující příklad ukazuje notaci závorky v JavaScriptu.
dokument['createElement']('před');
Příklad syntaxe
C#
třída Pero { soukromé int barva; // soukromé pole // veřejný majetek veřejnost int Barva { dostat { vrátit se tento.barva; } soubor { -li (hodnota > 0) { tento.barva = hodnota; } } }}
// přístup:Pero pero = Nový Pero();int color_tmp = 0;// ...pero.Barva = 17;color_tmp = pero.Barva;// ...pero.Barva = ~pero.Barva; // bitový doplněk ...// další hloupý příklad:pero.Barva += 1; // mnohem jasnější než „pen.set_Color (pen.get_Color () + 1)“!
Nedávné verze C # také umožňují "automaticky implementované vlastnosti", kde je pole kompilátoru během kompilace generováno záložní pole pro vlastnost. To znamená, že vlastnost musí mít setter. Může to však být soukromé.
třída Tvar { veřejnost Int32 Výška { dostat; soubor; } veřejnost Int32 Šířka { dostat; soukromé soubor; } }
C ++
![]() | tento článek možná matoucí nebo nejasné čtenářům.Říjen 2016) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) ( |
C ++ nemá vlastnosti první třídy, ale existuje několik způsobů, jak emulovat vlastnosti v omezené míře. Dvě z nich následují:
#zahrnout <iostream>šablona <typename T> třída vlastnictví { T hodnota; veřejnost: T & operátor = (konst T &i) { vrátit se hodnota = i; } // Tato šablona členské funkce třídy šablony slouží k tomu, aby se vytvořila // přísnější psaní. Přiřazení k tomuto je možné pouze u přesně identických typů. // Důvodem, proč to způsobí chybu, je dočasná proměnná vytvořená při převodu implicitního typu při inicializaci odkazu. šablona <typename T2> T2 & operátor = (konst T2 &i) { T2 &hlídat = hodnota; házet hlídat; // Nikdy nedosaženo. } // Implicitní převod zpět na T. operátor T konst & () konst { vrátit se hodnota; }};struktur Foo { // Vlastnosti využívající nepojmenované třídy. třída { int hodnota; veřejnost: int & operátor = (konst int &i) { vrátit se hodnota = i; } operátor int () konst { vrátit se hodnota; } } alfa; třída { plovák hodnota; veřejnost: plovák & operátor = (konst plovák &F) { vrátit se hodnota = F; } operátor plovák () konst { vrátit se hodnota; } } Bravo;};struktur Bar { // Použití vlastnosti <> - šablona. vlastnictví <bool> alfa; vlastnictví <nepodepsaný int> Bravo;};int hlavní () { Foo foo; foo.alfa = 5; foo.Bravo = 5.132f; Bar bar; bar.alfa = skutečný; bar.Bravo = skutečný; // Tento řádek přinese chybu času kompilace // kvůli členské funkci strážní šablony. ::std::cout << foo.alfa << ", " << foo.Bravo << ", " << bar.alfa << ", " << bar.Bravo << ::std::konec; vrátit se 0;}
Specifické pro C ++, Microsoft a C ++ Builder
Příklad převzatý z MSDN stránka dokumentace.
// declspec_property.cppstruktur S{ int i; prázdnota putprop(int j) { i = j; } int getprop() { vrátit se i; } __declspec(vlastnictví(dostat = getprop, dát = putprop)) int the_prop;};int hlavní(){ S s; s.the_prop = 5; vrátit se s.the_prop;}
D
třída Pero{ soukromé int m_color; // soukromé pole // public get property veřejnost int barva () { vrátit se m_color; } // vlastnost veřejné sady veřejnost prázdnota barva (int hodnota) { m_color = hodnota; }}
auto pero = Nový Pero;pero.barva = ~pero.barva; // bitový doplněk// vlastnost set lze také použít ve výrazech, stejně jako běžné přiřazeníint barva = (pero.barva = 0xFF0000);
Ve verzi D 2 musí být každý přístupový objekt vlastnosti nebo mutátor označen znakem @property:
třída Pero{ soukromé int m_color; // soukromé pole // veřejné získání majetku @vlastnictví veřejnost int barva () { vrátit se m_color; } // vlastnost veřejné sady @vlastnictví veřejnost prázdnota barva (int hodnota) { m_color = hodnota; }}
Delphi / Free Pascal
typ TPen = třída soukromé FColor: TColor; funkce GetColor: TColor; postup SetColor(konst Hodnota: TColor); veřejnost vlastnictví Barva: Celé číslo číst GetColor psát si SetColor;konec;funkce TPen.GetColor: TColor;začít Výsledek := FColor;konec;postup TPen.SetColor(konst Hodnota: TColor);začít -li FColor <> Hodnota pak FColor := Hodnota;konec;
// přístup:var Pero: TPen;// ...Pero.Barva := ne Pero.Barva;(*Delphi také podporuje syntaxi „přímého pole“ -vlastnost Barva: TColor čtení FColor zápis SetColor;nebovlastnost Barva: TColor čtení GetColor zápis FColor;kde kompilátor generuje přesně stejný kód jako pro čtení a zápispole. To nabízí efektivitu pole s bezpečností nemovitosti.(Ukazatel na vlastnost nelze získat a člena můžete vždy nahraditpřístup pomocí volání metody.)*)
eC
třída Pero { // soukromý datový člen Barva barva;veřejnost: // veřejný majetek vlastnictví Barva barva { dostat { vrátit se barva; } soubor { barva = hodnota; } }}Pero černé pero { barva = Černá };Pero bílé pero { barva = bílý };Pero pero3 { barva = { 30, 80, 120 } };Pero pero4 { barva = Barva HSV { 90, 20, 40 } };
F#
typ Pero() = třída nechat proměnlivý _barva = 0 člen tento.Barva s dostat() = _barva a soubor hodnota = _barva <- hodnotakonec
nechat pero = Nový Pero()pero.Barva <- ~~~pero.Barva
JavaScript
funkce Pero() { tento._barva = 0;}// Přidat vlastnost k samotnému typu pera, může také// být nastaven na instanci jednotlivěObjekt.defineProperties(Pero.prototyp, { barva: { dostat: funkce () { vrátit se tento._barva; }, soubor: funkce (hodnota) { tento._barva = hodnota; } }});
var pero = Nový Pero();pero.barva = ~pero.barva; // bitový doplněkpero.barva += 1; // Přidat jednu
ActionScript 3.0
balík { veřejnost třída Pero { soukromé var _barva:uint = 0; veřejnost funkce dostat barva():uint { vrátit se _barva; } veřejnost funkce soubor barva(hodnota:uint):prázdnota { _barva = hodnota; } }}
var pero:Pero = Nový Pero();pero.barva = ~pero.barva; // bitový doplněkpero.barva += 1; // přidat jeden
Objektiv C 2.0
@rozhraní Pero : NSObject@vlastnictví (kopírovat) NSColor *barva; // Atribut "copy" způsobí, že kopie objektu bude // zachováno, místo originálu.@konec@implementace Pero@syntetizovat barva; // Direktiva kompilátoru pro syntézu přístupových metod. // Může zůstat v Xcode 4.5 a novějších.@konec
Výše uvedený příklad lze použít v libovolné metodě, jako je tato:
Pero *pero = [[Pero alokace] inic];pero.barva = [NSColor Černá barva];plovák Červené = pero.barva.redComponent;[pero.barva drawSwatchInRect: NSMakeRect(0, 0, 100, 100)];
PHP
třída Pero{ soukromé int $ barva = 1; funkce __soubor($ nemovitost, $ hodnota) { -li (vlastnost_existuje($ toto, $ nemovitost)) { $ toto->$ nemovitost = $ hodnota; } } funkce __dostat($ nemovitost) { -li (vlastnost_existuje($ toto, $ nemovitost)) { vrátit se $ toto->$ nemovitost; } vrátit se nula; }}
$ str = Nový Pero();$ str->barva = ~$ str->barva; // Bitový doplněkecho $ str->barva;
Krajta
Vlastnosti fungují správně pouze pro třídy nového stylu (třídy, které mají objekt
jako nadtřída ) a jsou k dispozici pouze v Pythonu 2.2 a novějším (viz příslušná část tutoriálu Sjednocení typů a tříd v Pythonu 2.2 ). Python 2.6 přidal novou syntaxi zahrnující dekoratéry pro definování vlastností.
třída Pero: def __init__(já) -> Žádný: já._barva = 0 # "soukromá" proměnná @vlastnictví def barva(já): vrátit se já._barva @barva.seřizovač def barva(já, barva): já._barva = barva
pero = Pero()# Přístup:pero.barva = ~pero.barva # Bitový doplněk ...
Rubín
třída Pero def inicializovat @barva = 0 konec # Definuje getr pro pole @color def barva @barva konec # Definuje setr pro pole @color def barva=(hodnota) @barva = hodnota koneckonecpero = Pero.Novýpero.barva = ~pero.barva # Bitový doplněk
Ruby také poskytuje automatické gettery / settery syntetizátory definované jako instance metody třídy.
třída Pero attr_reader :značka # Generuje getter pro @ brand (pouze pro čtení) attr_writer :velikost # Generuje seřizovač pro @ velikost (pouze pro zápis) attr_accessor :barva # Generuje getr a setter pro @color (čtení / zápis) def inicializovat @barva = 0 # V rámci objektu můžeme přistupovat přímo k proměnné instance @značka = "Penbrand" @velikost = 0.7 # Mohli bychom ale také použít metodu setter definovanou metodou instance attr_accessor Class koneckonecpero = Pero.Novýuvádí pero.značka # Přístup ke značce pera prostřednictvím generovaného getrupero.velikost = 0.5 # Aktualizuje pole velikosti pera prostřednictvím generovaného seterupero.barva = ~pero.barva
Visual Basic
Visual Basic (.NET 2003-2010)
Veřejnost Třída Pero Soukromé _barva Tak jako Celé číslo „Soukromé pole Veřejnost Vlastnictví Barva() Tak jako Celé číslo ' Veřejný majetek Dostat Vrátit se _barva Konec Dostat Soubor(ByVal hodnota Tak jako Celé číslo) _barva = hodnota Konec Soubor Konec VlastnictvíKonec Třída
'Vytvořit instanci třídy PenZtlumit pero Tak jako Nový Pero()„Nastavit hodnotupero.Barva = 1„Získejte hodnotuZtlumit barva Tak jako Int32 = pero.Barva
Visual Basic (pouze .NET 2010)
Veřejnost Třída Pero Veřejnost Vlastnictví Barva() Tak jako Celé číslo ' Veřejný majetekKonec Třída
'Vytvořit instanci třídy PenZtlumit pero Tak jako Nový Pero()„Nastavit hodnotupero.Barva = 1„Získejte hodnotuZtlumit barva Tak jako Int32 = pero.Barva
Visual Basic 6
„ve třídě s názvem clsPenSoukromé m_Color Tak jako DlouhoVeřejnost Vlastnictví Dostat Barva() Tak jako Dlouho Barva = m_ColorKonec VlastnictvíVeřejnost Vlastnictví Nechat Barva(ByVal RHS Tak jako Dlouho) m_Color = RHSKonec Vlastnictví
'přístup:Ztlumit pero Tak jako Nový clsPen' ...pero.Barva = Ne pero.Barva