Companion Object in Scala

Læsetid: 4 minutter

for at forstå brugen af ledsagende objekter er det vigtigt at forstå de statiske medlemmer først. Vi har lært, at i objektorienterede sprog er klasser den plan, der indeholder medlemmer som felter og metoder. Men for at få adgang til disse felter eller metoder skal vi først konstruere objekterne fra disse klasser.

lad os 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 oprettede en klasse kaldet matematik med en metode kaldet sum, som tager to tal og returnerer summen som resultat.

for at udføre denne kode opretter vi en forekomst af denne Matematikklasse og påberåbte summetoden ved at omgå 5 og 10 og modtage 15 som output. Som vi ser, er summetoden imidlertid ikke afhængig af nogen af Medlemsvariablerne i matematikklassen.

for eksempel den maksimale medlemsvariabel i dette tilfælde. Så der bør ikke være behov for at oprette en forekomst af Matematikklasse for at påberåbe sig summetoden. Vi burde kunne kalde dette direkte i dette tilfælde. Og det er her de ledsagende genstande kommer ind i billedet.

der er fire ting, vi skal huske om ledsagende objekter:

1. De har samme navn som den tilsvarende klasse.

2. De starter med nøgleordet “objekt”.

3. De bor i samme kildefil som de tilsvarende klasser.

4. Ledsagerobjekterne og de tilsvarende klasser fungerer som hinandens private medlemmer.

nøgleordet “objekt” fortæller, at dette er et singleton-objekt. Med andre ord betyder det, at mens dit program kører, kan du oprette så mange forekomster fra dine klasser, som du vil, men singleton-objektet ville kun være en, og der vil ikke være flere forekomster af det.

lad os se dem i aktion ved hjælp af vores matematiske eksempel.

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 oprettet et nyt singleton-objekt kaldet Math, som har samme navn som vores klasse matematik. Det starter også med “objekt” nøgleordet og forbliver i samme fil som klassen matematik.

vi flyttede implementeringen for summen fra klassen til det ledsagende objekt. Dette skyldes, at da vi ved, at sumimplementeringen ikke er afhængig af medlemsvariablerne for matematikklassen, vil det at sætte denne implementering i ledsagerobjektet hjælpe opkalderne til ikke at oprette forekomsten af Matematikklasse og kalde den direkte.

der er en anden metode, vi har skrevet for at vise, at ledsagerobjektet har adgang til de private medlemmer af sin klasse.

her instantierer getPrivateMember matematikklassen og returnerer den privat medlem med navnet “maks”. Der er en ekstra ting at bemærke her. Når vi definerer getPrivateMember, satte vi ikke parenteserne. I Scala er der en konvention, hvor hvis metoden ikke har nogen argumenter at tage og ikke udfører nogen bivirkning, hvilket betyder, at det er en ren funktion, kan vi vælge at udelade parenteserne.

her returnerer getPrivateMember bare værdien af medlemsvariablen, så vi vælger at udelade parenteserne.

Math.sum(5, 10)Math.getPrivateMember

når vi udfører summetoden, udførte vi den fra Math companion-objektet og behøvede ikke at oprette den nye forekomst af Matematikklasse. Derudover var vi i stand til at få adgang til den private medlemsvariabel i matematikklassen fra ledsagerobjektet.

oprettelse af objekter ved hjælp af anvend

vi ved, at for at oprette en ny forekomst af et objekt, skal vi bruge det “nye” søgeord.

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 kaldet” Person ” med fornavn og efternavn som klasseparametre. Og vi opretter en ny forekomst af Person som vist ovenfor. Vi skabte “alice” som en ny Person, passerer i fornavnet og efternavnet.

men i Scala er der endnu en måde at oprette objekter uden at bruge det nye søgeord.

der er en metode kaldet “Anvend” i companion object, der behandles specielt af Scala compiler, og det lader os oprette nye forekomster af klasser uden at kræve det nye søgeord. Lad os lære at bruge det i vores kode.

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 oprettet et ledsagende objekt med Anvend metode i det. Det tager de argumenter, som vi har brug for for at oprette en forekomst af klasseperson, det skaber forekomsten af Person internt og returnerer forekomsten. Som vi ser, har vi oprettet forekomsten af Personklasse uden at bruge det nye nøgleord. Og vi kan få adgang til medlemmerne ligesom ethvert andet objekt. lart

det handler om følgesvend objekt fra denne blog. Bliv Ved Med At Lære, Bliv Ved Med At Vokse!!!

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.