Ominaisuus on tapa päästä käsiksi kohteen sisäiseen tilaan jäljittelemällä jonkin tyyppistä muuttujaa. Objektin ominaisuuden käyttäminen näyttää samalta kuin struct-kenttään pääsy (strukturoidussa ohjelmoinnissa), mutta se toteutetaan itse asiassa funktiokutsulla. Kun yrität asettaa tämän ominaisuuden arvon, yksi menetelmä kutsutaan, ja kun yrität saada tämän ominaisuuden arvon, kutsutaan toista menetelmää.
Ominaisuuksia sovellettaessa
Tyypillisesti ominaisuus liittyy johonkin objektin sisäiseen kenttään . Mutta ominaisuus ei välttämättä liity mihinkään objektimuuttujaan ollenkaan, vaikka objektin käyttäjä käsittelee sitä ikään kuin se olisi todellinen kenttä.
Ominaisuudet lisäävät ohjelmoinnin joustavuutta ja turvallisuutta, koska osana (julkista) käyttöliittymää niiden avulla voit muuttaa objektin sisäistä toteutusta muuttamatta sen kenttiä. Ominaisuudet helpottavat ohjelman muokkaamista huomattavasti tapauksissa, joissa luokka toteutettiin alunperin kapselointirikkomuksella ja myöhemmin oli tarpeen muuttaa tapaa, jolla kenttään pääsee käsiksi. Jos kielessä ei ole ominaisuusmekanismia, kenttäviittaukset olisi etsittävä ja korvattava accessor-menetelmillä.
Monissa ohjelmointikielissä ominaisuudet toteutetaan menetelmäparina : menetelmää, joka vastaanottaa ominaisuuden nykyisen arvon , kutsutaan aksesoriksi ; menetelmä, joka asettaa uuden ominaisuuden arvon , on mutaattori . Ohjelmointikielissä, jotka eivät tue ominaisuuksia, kuten C++ ja Java , aksessori/mutaattori-pari on yleinen korvike ne.
Ominaisuusmenetelmät on tapana nimetä ominaisuuden nimellä etuliitteillä get ja set : esimerkiksi Xyzzy-ominaisuuden osalta get_Xyzzy ja set_Xyzzy ( perinteinen C -tyyli ) tai GetXyzzy ja SetXyzzy ( CamelCase -tyyli ). Tämän nimeämisjärjestelmän ansiosta slanginimet getter ja setter ovat pysyneet ominaisuusmenetelmissä .
C#:n ominaisuudet ovat kenttiä, joissa on looginen lohko, joka sisältää avainsanat getja set.
Esimerkki luokasta, jolla on ominaisuus:
class MyClass { yksityinen int p_kenttä ; public int Kenttä { get { return p_field ; } yksityinen joukko { p_kenttä = arvo ; } } }Toteutusesimerkki VB.NETissä. Jos haluat ottaa käyttöön vain luku - tai kirjoitus -ominaisuuden , Vain luku - ja Vain kirjoitus -määritteet ovat voimassa. Omaisuus voidaan parametroida. Se voi olla myös oletusominaisuus, jota varten sinun on lisättävä oletusmuuttaja
Sub Main Dim F Uusi Foo _ F. _ Data = 5 F. _ Kohde ( 0 ) = 5 F ( 0 ) = 5 ' Kirjoita konsoli -ominaisuuteen . WriteLine ( F ( 0 )) 'Lue ominaisuus End Sub Julkinen luokka Foo Yksityinen m_Data Kokonaislukuna Yksityinen m_Arr ( ) Kokonaislukuna = { 1 , 2 , 3 , 4 , 5 } _ Julkisen omaisuuden tiedot kokonaislukuna ( arvo kokonaislukuna ) ' Asetaja m_Data = Arvon loppujoukko Hae palautus m_Data ' Saada loppu Hae loppuominaisuus _ _ _ Julkinen oletusominaisuuskohde ( parametri kokonaislukuna ) kokonaislukuna Parametrisoitu oletusominaisuusjoukko ( arvo kokonaislukuna ) m_Arr ( parametri ) = arvon loppujoukko Hae palautus m_Arr ( parametri ) Loppu Hae loppuomaisuuden loppuluokka _ _ _ _ _ _ _ _Delphin kiinteistöä kuvataan sanalla property.
Esimerkki luokasta, jolla on ominaisuus:
TMyClass = luokan yksityinen FMyField : Kokonaisluku ; menettely SetMyField ( const Arvo : Kokonaisluku ) ; toiminto GetMyField : Kokonaisluku ; julkinen omaisuus MyField : Kokonaisluku lue GetMyField kirjoittaa SetMyField ; loppu ; toiminto TMyClass . GetMyField : Kokonaisluku ; alkaa Tulos := FMyField ; loppu ; menettely TMyClass . SetMyField ( const Arvo : Kokonaisluku ) ; begin FMyField := Arvo ; loppu ;Rubyn ominaisuusilmoitukset eivät eroa menetelmäilmoituksista. Jos haluat esimerkiksi luoda kesto-ominaisuuden Song-luokalle, sinun on kuvattava menetelmät kesto ja kesto=(arvo)
luokka Kappaleen kesto @kesto loppu def kesto = ( arvo ) @kesto = arvo loppu loppuYksinkertainen pääsy sisäiseen objektimuuttujaan voidaan kuitenkin korvata kutsulla attr_accessor :duration -menetelmään.
luokka Kappale attr_accessor :kesto loppuMielenkiintoisempi on esimerkki kesto_in_minutes-ominaisuuden luomisesta, joka palauttaa tai asettaa keston ajan minuutteina:
luokka Song def kesto_minuutteina @kesto / 60 . 0 end def kesto_minuutteina = ( arvo ) @kesto = ( arvo * 60 ) . to_i loppuun _Kesto-ominaisuuden muuttaminen kuitenkin vaikuttaa kesto-ominaisuuteen. Esimerkiksi
laulu = laulu . uusi biisi . kesto_minuutteina = 1 . 2 tulostaa kappaletta . kesto # tulostaa 72Joukko menetelmiä sisustajien kanssa määrittelee, kuinka ominaisuutta käytetään (lukeminen, kirjoittaminen, poistaminen). Jos jokin menetelmistä poistetaan (paitsi @property), kyky työskennellä omaisuuden kanssa asianmukaisella tavalla menetetään.
Esimerkki luokasta, jolla on ominaisuus:
luokka A : def __init__ ( itse ): itse . __x = Ei mitään @property def x ( itse ): palauta itse . __x @x . asettaja def x ( itse , arvo ): itse . __x = arvo @x . poistaja def x ( itse ): itse . __x = Ei mitään >>> a = A () >>> a . x >>> a . x = 2 >>> a . x 2 >>> del a . x >>> a . x >>>