In olio-ohjelmoinnin , ilmoitus on luokan ryhmät yhdessä jäseniä, menetelmiä ja ominaisuuksia (attribuutit) yhteinen joukko esineitä .
Luokka julistaa toisaalta objektien tilaa kuvaavat attribuutit ja toisaalta menetelmät, jotka edustavat niiden käyttäytymistä.
Siksi luokka edustaa objektien luokkaa. Se näkyy myös muotina tai tehtaana , josta on mahdollista luoda esineitä; se on tavallaan "työkalupakki", jonka avulla voit tehdä objektin. Puhumme sitten objektista luokan esiintymänä (objektin luominen, jolla on luokan ominaisuudet).
Perinnemekanismin ansiosta on mahdollista rajoittaa luokan A edustamaa objektijoukkoa . Tässä tapauksessa luomme uuden luokan B, joka on liitetty luokkaan A ja joka lisää uusia ominaisuuksia. Tässä tapauksessa käytetään erilaisia termejä:
Seuraavissa esimerkeissä määritellään eri kielillä luokka, Pointjolla on kaksi määritettä xja y. Tämä luokka sisältää:
Rakentaja on sääntö alustuksen menettelyt, joita kutsutaan, kun luodaan uusi luokan instanssi. Se määrittelee objektin sisäiselle tilalle ensimmäisen kelvollisen tilan. Tämä sääntö voidaan kääntää lyhyesti käsitteellä "rakenteiden, muuttujien ilmoittaminen". Ilmoitettuja rakentajia voi olla useita. Rakentajan puuttuessa kääntäjä luo sellaisen oletusarvoisesti.
Menetelmä on menettelyyn, jota sääntöä sovelletaan ominaisuuksia luokan. Tämä sääntö voidaan kääntää lyhyesti toiminnon tai rutiinin käsitteellä. Luokassa voi olla useita menetelmiä. Menetelmät ovat luokan keskeisiä elementtejä.
Vuoden 2015 painoksesta ( ECMAScript 6 ) alkaen on lisätty luokan määritelmän syntakse, joka yksinkertaistaa sen prototyyppisen perintämekanismin käyttöä objektisuuntautuneessa kehityksessä:
class Point { constructor(x, y) { this._x = x; this._y = y; } getX() { return this._x; } getY() { return this._y; } isOrigin() { return this._x === 0 && this._y === 0; } translate(pt) { return new Point(this._x + pt._x, this._y + pt._y); } }Luokan sanotaan olevan muuttumaton, jos tämän luokan objektia ei ole mahdollista muokata sen luomisen jälkeen. Esimerkiksi edellä eri kielillä kuvattu Point-luokka on muuttumaton, koska se ei paljasta mitään menetelmää jäsenmuuttujiensa arvon muokkaamiseksi. Menetelmä translatepalauttaa uuden objektin itse objektin muokkaamisen sijaan. java.lang.StringJava-ympäristön luokka on toinen esimerkki muuttumattomasta luokasta, kuten Microsoft .NET-System.String kehyksen luokka .
Joillakin kielillä luokka voidaan määritellä osittain. Joillakin tämän luokan menetelmillä ei ole runkoa tai toteutusta. Näitä menetelmiä kutsutaan "abstrakteiksi" (tai virtuaaleiksi C ++: ssa ).
Luokat, joissa on vähintään yksi abstrakti menetelmä, kutsutaan myös abstrakteiksi (tai virtuaalisiksi) luokiksi, eikä niitä voida suoraan instansoida - paitsi luomalla ei-abstrakti alaluokka.
Esimerkki Haluamme mallintaa vektoripiirroksen objektisuhteet. Voimme sanoa, että piirustusobjekti on joukko geometrioita (abstrakti luokka) ja jokainen geometria voi olla piste, monikulmio tai katkoviiva (nämä kolme luokkaa perivät geometriasta). Abstrakti luokka ei siis ole itsessään välttämätön, mutta se on välttämätöntä puhtaalle, yleiselle ja yksinkertaistetulle mallille.Mixin on erikoistapaus abstrakti luokka. Sen avulla voit lisätä palvelun alaluokkiin.
Luokkaa, jolla on vain abstrakteja menetelmiä, kutsutaan puhtaasti virtuaaliseksi rajapinnaksi tai luokaksi (C ++) tai protokollaksi ( tavoite C ).
Luokan luokka on metaklassia . Metaklassit mahdollistavat rakenteellisen heijastuksen .
Aikaisemmin määritelty luokka on joukko jäseniä (menetelmiä ja määritteitä), joita on välttämättä käsiteltävä. Jos p on esimerkki pisteestä (a, b), jossa a ja b ovat int- tyyppisiä , pääsemme p : n jäseniin näin:
Heti mieleen tuleva kysymys on seuraava: miksi määritetään getX () -metodi , kun voimme käyttää suoraan Point- luokan x- ja y- kenttiä ?
Itse asiassa, kun joudutaan käsittelemään monia luokkia sekä monia suhteita näiden luokkien välillä (vrt. Perintö ), kaavasta, tiedoista ja operaatioista voi tulla hyvin monimutkaisia (varsinkin henkilölle, joka ei ole suunnitellut koodattua). Siksi käytämme mekanismia nimeltä tietojen kapselointi , joka on vastuussa luokan kenttien piilottamisesta tietyiltä ohjelman osilta eheyden vuoksi. Siksi käyttäjän on manipuloitava vain menetelmiä, jotka on hyväksytty ja jotka teoriassa täyttävät tehtävänsä hyvin.
Kapselointiperiaatteen mukaan menetelmillä on julkinen pääsy - tämä tarkoittaa, että mikä tahansa ohjelman osa voi käyttää menetelmää. Mitä tulee valtion komponenttimääritteisiin, joihin he pääsevät yksityisiksi ( yksityisiksi ) - Vain itse esineellä (ja siten sen sisältämillä menetelmillä) on suora pääsy attribuutteihinsa. Tällöin ainoa tapa käyttää näitä määritteitä on käyttää objektin menetelmiä. Määritteitä ei voida käyttää suoraan ohjelman toisella osalla tai edes muulla objektilla, vaikka tämä objekti olisi samaan luokkaan. Toinen asia: objektin muut jäsenet pääsevät suoraan käsiksi kaikkiin objektin perintöominaisuuksiin.
Viimeisimpien huomautusten osalta on usein hämmennystä yksityisen pääsyn semantiikasta. Kapseloinnin periaate merkitsee niiden ominaisuuksien suojaamista, joita kutsumme pystysuoriksi (vain itse esineellä ja alaluokan kohteilla on pääsy siihen). Löydämme tämän semantiikan sellaisilla kielillä kuin Smalltalk , Oz tai OCaml . Jotkut kielet, kuten C ++ , Pascal tai Java , kuitenkin vetoavat määritteiden suojaamiseen, joita kutsumme vaakasuoriksi (saman luokan kohteilla on pääsy niihin, mutta ei alaluokkien kohteisiin).
Jotkin kielet sallivat luokan julistamisen aikana muuttaa sen jäsenten ja siten myös tästä luokasta havainnoitujen esineiden jäsenten laajuutta ; laajuuden muuttaminen vähentää näkyvyyttä ja siten jäsenille pääsyä.
Esimerkiksi C ++ - ja Object Pascal -kielet tarjoavat seuraavat laajuusmuutokset :
Soveltamisala | Avainsana | Näkyvä (käytettävissä) | Merkintä | ||
---|---|---|---|---|---|
(näkyvyys) | C ++: ssa | luokan jäsen | johdettu luokka | objektin asiakas | |
julkinen | public | Joo | Joo | Joo | Julkiset jäsenet ovat yhtä helposti saatavilla kuin tämän luokan instantisoitu objekti (objektin asiakas näkee ja käyttää tässä laajuudessa ilmoitettuja jäseniä). |
suojattu | protected | Joo | Joo | ei | Suojattuja jäseniä voivat käyttää vain tämän luokan instantisoidun objektin jäsenet ja siitä johdetut luokat. |
yksityinen | private | Joo | ei | ei | Yksityisiin jäseniin pääsevät vain tämän luokan välittömän objektin jäsenet (he eivät pääse lapsiluokan tai kohteen asiakkaan luokse). |
Näiden laajuuksien semantiikka ja lukumäärä vaihtelevat ohjelmointikielen mukaan.
Esimerkiksi Java tarjoaa hieman erilaisen määritelmän suojatuille jäsenille; se ulottuu kaikkiin saman luokan, alaluokkien ja saman paketin luokkiin.
Esimerkiksi Python tarjoaa mahdollisuuden muokata luokan jäsenten näkyvyyttä lisäämällä jäsenen nimeen alaviiva ('_'):
Kun meidän on käsiteltävä samantyyppisiä tietoja (esimerkiksi koordinaattijärjestelmän pisteitä), saatamme haluta soveltaa operaatioita näihin objekteihin (OOP: n merkityksessä). Siten kahden vyöhykkeen (polygonin) sulautuminen antaa uuden vyöhykkeen, aivan kuten kahden pisteen lisääminen antaa uuden pisteen.
Jatketaan Point-luokkaamme. Seuraava Python-esimerkki on erittäin kertova:
class Point: (...) def __add__(self,point): # Surcharge de '+' return Point(self.x + point.x, self.y + point.y) p=Point(0,0) q=Point(2,3) r=p+qJoten r.getX () palauttaa arvon 2.