lukuaika: 4 minuuttia
jotta voidaan ymmärtää kumppaniobjektien käyttöä, on tärkeää ymmärtää ensin staattiset jäsenet. Olemme oppineet, että oliopainotteisissa kielissä luokat ovat pohjapiirustus, joka sisältää jäseniä, kuten kenttiä ja menetelmiä. Mutta voidakseen käyttää näitä kenttiä tai menetelmiä, meidän on ensin rakentaa esineitä näistä luokista.
katsotaanpa esimerkkiä.
class Math { private val max = 100 def sum(a: Int, b: Int): Int = a + b}object Test { def main(args: Array): Unit = { val math = new Math() math.sum(5, 10) }}
loimme luokan nimeltä matematiikka menetelmällä nimeltä summa, joka ottaa kaksi lukua ja palauttaa summan tulokseksi.
tämän koodin toteuttamiseksi luodaan esiintymä tästä Matematiikkaluokasta ja vedotaan summamenetelmään ohittaen 5 ja 10, saaden tulokseksi 15. Kuitenkin, kuten näemme, summamenetelmä ei ole riippuvainen mistään matematiikan luokan jäsenmuuttujista.
esimerkiksi max-jäsenmuuttuja tässä tapauksessa. Niin, ei pitäisi olla tarvetta luoda instanssi matematiikan luokan voidakseen vedota summa menetelmä. Meidän pitäisi voida soittaa tähän suoraan tässä tapauksessa. Tässä kohtaa kuvaan tulevat seuralaisesineet.
on neljä asiaa, jotka täytyy muistaa kumppaniesineistä:
1. Niillä on sama nimi kuin vastaavalla luokalla.
2. Ne alkavat ”objekti” – avainsanalla.
3. Ne elävät samassa lähdekooditiedostossa kuin vastaavat luokat.
4. Seuralaisobjektit ja vastaavat luokat toimivat toistensa yksityisinä jäseninä.
”objekti” – avainsana kertoo, että kyseessä on singleton objekti. Toisin sanoen, se tarkoittaa, että kun ohjelma on käynnissä, voit luoda niin monta esiintymiä luokista kuin haluat, mutta singleton objekti olisi vain yksi, ja ei ole useita esiintymiä sitä.
katsotaan ne toiminnassa matemaattisen esimerkkimme avulla.
object Math { def sum(a: Int, b: Int): Int = a + b def getPrivateMember: Int = = new Math().max}class Math { private val max = 100}object Test { def main(args: Array): Unit = { Math.sum(5, 10) Math.getPrivateMember }}
kuten näemme, olemme luoneet uuden singleton-objektin nimeltä matematiikka, jolla on sama nimi kuin luokkamatematiikallamme. Se alkaa myös” objekti ” – avainsanalla ja pysyy samassa tiedostossa luokkamatematiikan kanssa.
siirsimme summan toteutuksen luokasta sen kumppaniobjektiin. Tämä johtuu siitä, että koska tiedämme, että summatoteutus ei ole riippuvainen Math class-jäsenmuuttujista, kyseisen toteutuksen laittaminen kumppaniobjektiin auttaa soittajia olemaan luomatta Math class-esiintymää ja kutsumaan sitä suoraan.
on toinenkin kirjoittamamme tapa osoittaa, että kumppaniobjektilla on pääsy luokkansa yksityisiin jäseniin.
tässä getprivatember instantioi Matikkatunnin ja palauttaa sen yksityisjäseneksi nimeltä ”max”. Tässä on vielä yksi asia huomioitavana. Kun määrittelemme get-yksityisjäsen, emme laittaneet sulkuja. Scalassa on sopimus, jossa jos menetelmällä ei ole argumentteja eikä sillä ole sivuvaikutuksia, eli se on puhdas funktio, voimme jättää sulkeet pois.
tässä getprivatember on juuri palauttamassa jäsenmuuttujan arvoa, joten päätämme jättää sulut pois.
Math.sum(5, 10)Math.getPrivateMember
kun suoritamme summamenetelmän, suoritimme sen Math companion-oliosta eikä tarvinnut luoda uutta matematiikkaluokan ilmentymää. Lisäksi pääsimme käsiksi matematiikan luokan yksityiseen jäsenmuuttujaan kumppaniobjektista.
objektien luominen käyttäen Apply
tiedämme, että luodaksemme uuden ilmentymän objektista, meidän on käytettävä ”uutta” avainsanaa.
esimerkiksi:
class Person(firstName: String, lastName: String) {def getName: String = firstName + lastName}object Test { def main(args: Array): Unit = { val alice = new Person("Alice", "Christy") }}
meillä on ”henkilö” – niminen luokka, jonka luokkaparametreina ovat etu-ja sukunimi. Ja luomme uuden esimerkiksi henkilö kuten yllä. Loimme ”alice” uutena henkilönä, kulkee etu-ja sukunimi.
kuitenkin Scalassa on vielä yksi tapa luoda objekteja käyttämättä uutta avainsanaa.
on olemassa ”apply” – niminen menetelmä kumppaniobjektissa, jota Scala-kääntäjä käsittelee erityisesti, ja sen avulla voidaan luoda uusia esiintymiä luokista ilman, että tarvitaan uutta avainsanaa. Opetellaan käyttämään sitä koodissamme.
object Person { def apply(firstName: String, lastName: String): Person = new Person(firstName, lastName)}class Person(firstName: String, lastName: String) { def getName: String = firstName + " " + lastName}object Test { def main(args: Array): Unit = { val alice = Person("Alice", "Christy") println(p.getName) }}
kuten tässä näkyy, olemme luoneet kumppaniobjektin, johon sovelletaan menetelmää. Se vie argumentit, että meidän täytyy luoda esimerkiksi luokan henkilö, se luo esimerkiksi henkilön sisäisesti, ja palauttaa esimerkiksi. Kuten näemme, olemme luoneet esimerkiksi Henkilöluokan käyttämättä uutta avainsanaa. Jäseniin pääsee käsiksi kuten mihin tahansa esineeseen. 🙂
se kertoo Kumppaniobjektista tästä blogista. Jatka Oppimista, Jatka Kasvamista!!!