Vlastnost je způsob, jak získat přístup k vnitřnímu stavu objektu, napodobující proměnnou nějakého typu. Přístup k vlastnosti objektu vypadá stejně jako přístup k poli struct (ve strukturovaném programování), ale ve skutečnosti je implementován prostřednictvím volání funkce. Když se pokusíte nastavit hodnotu této vlastnosti, zavolá se jedna metoda, a když se pokusíte získat hodnotu této vlastnosti, zavolá se jiná metoda.
Při aplikaci vlastností
Vlastnost je obvykle spojena s nějakým vnitřním polem objektu. Ale vlastnost nemusí být vůbec spojena s žádnou objektovou proměnnou, ačkoli s ní uživatel daného objektu nakládá, jako by to bylo skutečné pole.
Vlastnosti zvyšují flexibilitu a bezpečnost programování, protože jako součást (veřejného) rozhraní umožňují měnit vnitřní implementaci objektu beze změny jeho polí. Vlastnosti výrazně usnadňují úpravu programu v případech, kdy byla třída původně implementována s porušením encapsulation a později bylo nutné změnit způsob přístupu k poli. Při absenci mechanismu vlastností v jazyce by bylo nutné vyhledávat a nahrazovat odkazy na pole metodami přístupového objektu.
V mnoha programovacích jazycích jsou vlastnosti implementovány jako dvojice metod : metoda, která přijímá aktuální hodnotu vlastnosti, se nazývá přístupový objekt ; metoda, která nastavuje novou hodnotu vlastnosti , je mutátor . V programovacích jazycích, které nepodporují vlastnosti, jako je C++ a Java , je dvojice přístupový objekt/mutátor běžnou náhradou.
Je obvyklé pojmenovat metody vlastností názvem vlastnosti s předponami get a set : například pro vlastnost Xyzzy get_Xyzzy a set_Xyzzy ( tradiční styl C ) nebo GetXyzzy a SetXyzzy ( styl CamelCase ). Kvůli tomuto schématu pojmenování se slangová jména getter a setter držela metod vlastností .
Vlastnosti v C# jsou pole s logickým blokem obsahujícím klíčová slova geta set.
Příklad třídy s vlastností:
class MyClass { private int p_field ; public int Pole { get { return p_pole ; } private set { p_pole = hodnota ; } } }Příklad implementace ve VB.NET. Pokud chcete implementovat vlastnost pouze pro čtení nebo jen pro zápis , použijí se modifikátory ReadOnly a WriteOnly. Vlastnost lze parametrizovat. Může to být také výchozí vlastnost, k tomu musíte přidat modifikátor Výchozí
Sub Main Dim F As New Foo F. _ Data = 5 F . Item ( 0 ) = 5 F ( 0 ) = 5 ' Zápis do vlastnosti Console . WriteLine ( F ( 0 )) 'Vlastnost čtení End Sub Public Class Foo Private m_Data As Integer Private m_Arr () As Integer = { 1 , 2 , 3 , 4 , 5 } Data veřejného vlastnictví jako celočíselná sada ( Value As Integer ) 'Setter m_Data = Koncová sada hodnot Získat návrat m_Data ' Získat konec Získat koncovou vlastnost Veřejná výchozí položka vlastnosti ( Param As Integer ) As Integer ' Výchozí parametrizovaná vlastnost Set ( Value As Integer ) m_Arr ( Param ) = Hodnota End Set Get Return m_Arr ( Param ) End Get End Vlastnost End ClassVlastnost v Delphi je popsána slovem property.
Příklad třídy s vlastností:
TMyClass = class private FMyField : Integer ; procedura SetMyField ( const Value : Integer ) ; function GetMyField : Integer ; public property MyField : Integer read GetMyField write SetMyField ; konec ; funkce TMyClass . GetMyField : Integer ; begin Vysledek := FMyField ; konec ; postup TMyClass . SetMyField ( const Value : Integer ) ; begin FMyField := Hodnota ; konec ;Deklarace vlastností v Ruby se neliší od deklarací metod. Chcete-li například vytvořit vlastnost trvání pro třídu Song, musíte popsat metody trvání a trvání=(hodnota)
class Song def Duration @duration end def Duration = ( value ) @duration = value end endJednoduchý přístup k interní objektové proměnné však lze nahradit voláním metody attr_accessor :duration
class Song attr_accessor :duration endZajímavější je příklad vytvoření vlastnosti Duration_in_minutes, která vrátí nebo nastaví dobu trvání v minutách:
class Skladba def Duration_in_minutes @duration / 60 . 0 end def Duration_in_minutes = ( hodnota ) @duration = ( hodnota * 60 ) . to_i end endZměna vlastnosti Duration_in_minutes však ovlivní vlastnost Duration. Například
píseň = píseň . nová píseň . trvání_v_minutách = 1 . 2 tisknout píseň . trvání # vytiskne 72Sada metod s dekorátory definuje, jak pracovat s vlastností (čtení, zápis, mazání). Pokud je některá z metod odstraněna (s výjimkou @property), ztrácí se možnost pracovat s vlastností odpovídajícím způsobem.
Příklad třídy s vlastností:
třída A : def __init__ ( self ): self . __x = Žádný @property def x ( self ): return self . __X @x . setter def x ( self , hodnota ): self . __x = hodnota @x . deleter def x ( self ): self . __x = Žádný >>> a = A () >>> a . x >>> a . x = 2 >>> a . x 2 >>> del a . x >>> a . x >>>