timp de citire: 4 minute
pentru a înțelege utilizarea de obiecte de companie, este important să se înțeleagă membrii statice în primul rând. Am învățat că în limbajele orientate pe obiecte, clasele sunt planul care conține membri precum câmpuri și metode. Dar pentru a accesa aceste câmpuri sau metode, trebuie mai întâi să construim obiectele din aceste clase.
să ne uităm la un exemplu.
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) }}
am creat o clasă numită Math cu o metodă numită sum, care ia două numere și returnează suma ca rezultat.
pentru a executa acest cod, creăm o instanță a acestei clase de Matematică și invocăm metoda sum ocolind 5 și 10, primind 15 ca ieșire. Cu toate acestea, după cum vedem, metoda sum nu depinde de niciuna dintre variabilele membre ale clasei de matematică.
de exemplu, variabila max membru în acest caz. Deci, nu ar trebui să fie nevoie să creați o instanță a clasei de matematică pentru a invoca metoda sum. Ar trebui să putem apela acest lucru direct în acest caz. Și aici intră în imagine obiectele însoțitoare.
există patru lucruri pe care trebuie să le amintim despre obiectele însoțitoare:
1. Au același nume ca și clasa corespunzătoare.
2. Acestea încep cu cuvântul cheie” obiect”.
3. Ei trăiesc în același fișier sursă ca și clasele corespunzătoare.
4. Obiectele însoțitoare și clasele corespunzătoare acționează ca membri privați ai celuilalt.
cuvântul cheie „obiect” spune că acesta este un obiect singleton. Cu alte cuvinte, înseamnă că, în timp ce programul dvs. rulează, puteți crea câte instanțe din clasele dvs. doriți, dar obiectul singleton ar fi doar unul și nu vor exista mai multe instanțe ale acestuia.
să le vedem în acțiune folosind exemplul nostru de matematică.
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 }}
după cum vedem, am creat un nou obiect singleton numit Math, care are același nume ca matematica noastră de clasă. De asemenea, începe cu cuvântul cheie „obiect” și rămâne în același fișier ca matematica clasei.
am mutat implementarea pentru suma de la clasă la obiectul însoțitor. Acest lucru se datorează faptului că, după cum știm că implementarea sumei nu depinde de variabilele membre pentru clasa de matematică, punerea acelei implementări în obiectul însoțitor îi va ajuta pe apelanți să nu creeze instanța clasei de Matematică și să o numească direct.
există o altă metodă pe care am scris-o pentru a arăta că obiectul însoțitor are acces la membrii privați ai clasei sale.
aici getPrivateMember instanțiază clasa de Matematică și o returnează membru privat numit „max”. Există un lucru suplimentar de remarcat aici. Când definim getPrivateMember, nu am pus parantezele. În Scala, există o convenție în care, dacă metoda nu are argumente de luat și nu efectuează niciun efect secundar, ceea ce înseamnă că este o funcție pură, putem alege să omitem parantezele.
aici, getPrivateMember returnează doar valoarea variabilei membre, așa că alegem să omitem parantezele.
Math.sum(5, 10)Math.getPrivateMember
când executăm metoda sum, am executat-o din obiectul Math companion și nu a trebuit să creăm noua instanță a clasei Math. În plus, am putut accesa variabila membru privat a clasei de Matematică din obiectul însoțitor.
crearea obiectelor folosind Apply
știm că pentru a crea o nouă instanță a unui obiect, trebuie să folosim cuvântul cheie „nou”.
de exemplu:
class Person(firstName: String, lastName: String) {def getName: String = firstName + lastName}object Test { def main(args: Array): Unit = { val alice = new Person("Alice", "Christy") }}
avem o clasă numită „persoană” cu firstName și lastName ca parametri de clasă. Și vom crea o nouă instanță a persoanei așa cum se arată mai sus. Am creat „alice” ca o persoană nouă, trecând numele și prenumele.
cu toate acestea, în Scala, există încă o modalitate de a crea obiecte fără a utiliza noul cuvânt cheie.
există o metodă numită „apply” în companion object care este tratată special de compilatorul Scala și ne permite să creăm noi instanțe de clase fără a necesita noul cuvânt cheie. Să învățăm cum să o folosim în codul nostru.
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) }}
după cum vedem aici, am creat un obiect însoțitor cu metoda de aplicare în el. Este nevoie de argumentele de care avem nevoie pentru a crea o instanță a persoanei de clasă, creează instanța persoanei intern și returnează instanța. După cum vedem, am creat instanța clasei de persoane fără a utiliza noul cuvânt cheie. Și putem accesa membrii la fel ca orice alt obiect.
asta e tot despre Companion obiect din acest blog. Continuă Să Înveți, Continuă Să Crești!!!