Lesetid: 4 minutter
for å forstå bruken av companion objects, er det viktig å forstå de statiske medlemmene først. Vi har lært at i objektorienterte språk, klasser er blåkopi som inneholder medlemmer som felt og metoder. Men for å få tilgang til disse feltene eller metodene må vi først konstruere objektene fra disse klassene.
la oss se på et eksempel.
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) }}
vi opprettet en klasse kalt Matte med en metode som kalles sum, som tar inn to tall og returnerer summen som resultat.
for å utføre denne koden oppretter vi en forekomst av Denne Matteklassen og påberoper sum-metoden omgå 5 og 10, og mottar 15 som utgang. Som vi ser, er sum-metoden imidlertid ikke avhengig av noen av medlemsvariablene I Matteklassen.
for eksempel, maks medlemsvariabelen i dette tilfellet. Så det bør ikke være nødvendig å opprette En forekomst Av Matteklasse for å påkalle sum-metoden. Vi burde kunne ringe dette direkte i dette tilfellet. Og det er her følgesvennene kommer inn i bildet.
det er fire ting vi må huske om ledsagerobjekter:
1. De har samme navn som den tilsvarende klassen.
2. De starter med søkeordet» objekt».
3. De bor i samme kildefil som de tilsvarende klassene.
4. Ledsagerobjektene og de tilhørende klassene fungerer som hverandres private medlemmer.
nøkkelordet «objekt» forteller at dette er et singleton-objekt. Med andre ord betyr det at mens programmet kjører, kan du opprette så mange forekomster fra klassene dine som du vil, men singleton-objektet vil bare være en, og det vil ikke være flere forekomster av det.
la oss se dem i aksjon ved hjelp Av Vårt Matteeksempel.
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 }}
som vi ser, har vi opprettet et nytt singleton-objekt kalt Matte, som har samme navn som Vår Klassematikk. Den starter også med «objekt» søkeord og forblir i samme fil som klassen Matte.
vi flyttet implementeringen for summen fra klassen til det tilhørende objektet. Dette skyldes at, som vi vet at sumimplementeringen ikke er avhengig av medlemsvariablene For Matteklassen, vil det å sette implementeringen i følgesvennobjektet hjelpe innringerne til ikke å opprette forekomsten Av Matteklassen og kalle den direkte.
det er en annen metode vi har skrevet for å vise at ledsagerobjektet har tilgang til private medlemmer av sin klasse.
her starter getprivatemedlemmet Matteklassen og returnerer det private medlemmet med navnet «max». Det er en ekstra ting å merke seg her. Når vi definerer getPrivateMember, satte vi ikke parentesene. I Scala er Det en konvensjon der hvis metoden ikke har noen argumenter å ta og ikke utfører noen bivirkning, noe som betyr at det er en ren funksjon, kan vi velge å utelate parentesene.
her returnerer getprivatemedlem bare verdien av medlemsvariabelen, så vi velger å utelate parentesene.
Math.sum(5, 10)Math.getPrivateMember
når vi utfører sum-metoden, utførte vi den fra Math companion-objektet og måtte ikke opprette den nye forekomsten Av Math-klassen. I tillegg var vi i stand til å få tilgang til privatmedlemsvariabelen I Matteklassen fra følgesvennobjektet.
Opprette Objekter Ved Hjelp Av Apply
vi vet at for å opprette en ny forekomst av et objekt, må vi bruke» nytt » søkeord.
for eksempel:
class Person(firstName: String, lastName: String) {def getName: String = firstName + lastName}object Test { def main(args: Array): Unit = { val alice = new Person("Alice", "Christy") }}
vi har en klasse kalt «Person» med fornavn og etternavn som klasseparametere. Og vi lager en ny forekomst Av Person som vist ovenfor. Vi opprettet «alice» som en ny Person, passerer i fornavn og etternavn.
men I Scala er det en annen måte å lage objekter uten å bruke det nye søkeordet.
det er en metode som kalles «apply» i companion object som behandles spesielt Av scala-kompilatoren, og det lar oss lage nye forekomster av klasser uten å kreve det nye søkeordet. La oss lære å bruke den i koden vår.
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) }}
som vi ser her, har vi opprettet et følgesvennobjekt med bruk metode i den. Det tar argumentene som vi trenger for å lage en forekomst av klasseperson, det skaper forekomsten av Person internt, og returnerer forekomsten. Som vi ser, har vi opprettet forekomsten Av Personklasse uten å bruke det nye søkeordet. Og vi kan få tilgang til medlemmene akkurat som alle andre objekter. 🙂
det handler Om Følgesvennobjekt fra denne bloggen. Fortsett Å Lære, Fortsett Å Vokse!!!