Uvod u osobine u Groovyju

1. Pregled

U ovom uputstvu istražit ćemo pojam osobina u Groovyju. Predstavljeni su u izdanju Groovy 2.3.

2. Što su osobine?

Osobine su komponente za višekratnu upotrebu koje predstavljaju skup metoda ili ponašanja koje možemo koristiti za proširenje funkcionalnosti više klasa.

Zbog ovog razloga, oni se smatraju sučeljima koja nose i zadane implementacije i stanje. Sve se osobine definiraju pomoću osobina ključna riječ.

3. Metode

Deklariranje metode u a osobina je slično deklariranju bilo koje redovne metode u klasi. Međutim, ne možemo deklarirati zaštićene ili paketno-privatne metode u a osobina.

Pogledajmo kako se primjenjuju javne i privatne metode.

3.1. Javne metode

Za početak ćemo istražiti kako javnost metode su implementirane u a osobina.

Stvorimo a osobina imenovan UserTrait i a javnostreci zdravo metoda:

osobina UserTrait {String sayHello () {return "Hello!" }}

Nakon toga stvorit ćemo Zaposlenik razred, koji provodi UserTrait:

class Zaposlenik implementira UserTrait {}

Sada, izradimo test kako bismo provjerili je li Zaposlenik instance može pristupiti reći zdravo metoda UserTrait:

def 'Treba vratiti niz msg kada se koristi metoda Employee.sayHello koju pruža korisnička osobina' () {kada: def msg = worker.sayHello () tada: msg msg instanceof String potvrditi msg == "Pozdrav!" }

3.2. Privatne metode

Također možemo stvoriti i privatni metoda u a osobina a na njega se pozvati u drugom javnost metoda.

Pogledajmo implementaciju koda u UserTrait:

private String pozdravMessage () {return 'Pozdrav, iz privatne metode!' } String greet () {def msg = pozdravMessage () println msg return msg} 

Imajte na umu da ako pristupimo privatni metoda u klasi implementacije, bacit će a MissingMethodException:

def 'Trebao bi vratiti MissingMethodException kada se koristi metoda Employee.greetingMessage' () {kada: def iznimka pokušati {worker.greetingMessage ()} catch (Exception e) {iznimka = e} then: iznimka iznimka instanceof groovy.lang.MissingMethodException potvrditi iznimku. message == "Nema potpisa metode: com.baeldung.traits.E Employee.greetingMessage ()" + "primjenjivo je za vrste argumenata: () vrijednosti: []"}

U osobina, privatna metoda može biti presudna za bilo koju implementaciju koju ne bi trebala nadjačati nijedna klasa, iako je to potrebno prema drugim javnim metodama.

3.3. Apstraktne metode

A osobina može sadržavati i sažetak metode koje se zatim mogu implementirati u drugu klasu:

osobina UserTrait {sažetak Naziv niza () Niz showName () {return "Pozdrav, $ {name ()}!" }}
class Zaposlenik implementira UserTrait {String name () {return 'Bob'}} 

3.4. Nadjačavanje zadanih metoda

Obično, a osobina sadrži zadane implementacije svojih javnih metoda, ali ih možemo nadjačati u klasi implementacije:

osobina SpeakingTrait {Niz govori () {povratak "Govorim !!" }} 
class Pas implementira SpeakingTrait {String speak () {return "Bow Bow !!" }} 

Osobine ne podržavaju zaštićen i privatni opsega.

4. ovaj Ključna riječ

Ponašanje ovaj ključna riječ slična je onoj u Javi. Možemo razmotriti osobina kao super razred.

Na primjer, stvorit ćemo metodu koja se vraća ovaj u osobina:

osobina UserTrait {def self () {return this}}

5. Sučelja

A osobina također može implementirati sučelja, baš kao što to rade redovne klase.

Stvorimo sučelje i provesti ga u a osobina:

sučelje Human {String lastName ()}
osobina UserTrait implementira Human {String showLastName () {return "Pozdrav, $ {lastName ()}!" }}

Sada, provedimo sažetak metoda sučelje u klasi implementacije:

klasa Zaposlenik implementira UserTrait {String lastName () {return "Marley"}}

6. Svojstva

Možemo dodati svojstva a osobina baš kao i u bilo kojem redovnom razredu:

osobina UserTrait implementira Human {String email String address}

7. Proširivanje osobina

Slično redovnom Groovyju razred, a osobina može proširiti drugu osobina koristiti proteže se ključna riječ:

trait WheelTrait {int noOfWheels} trait VehicleTrait produžuje WheelTrait {String showWheels () {return "Broj kotača $ noOfWheels"}} klasa Automobil implementira VehicleTrait {}

Također možemo proširiti više osobina pomoću provodi klauzula:

osobina AddressTrait {String livingAddress} osobina EmailTrait {String email} osobina Osoba implementira AddressTrait, EmailTrait {}

8. Sukobi višestrukog nasljeđivanja

Kada klasa implementira dvije ili više osobina koje imaju metode s istim potpisom, moramo znati riješiti sukobe. Pogledajmo kako Groovy rješava takve sukobe prema zadanim postavkama, kao i način na koji možemo nadjačati zadanu razlučivost.

8.1. Zadano rješavanje sukoba

Prema zadanim postavkama metoda iz posljednjeg deklariranog osobina u provodi klauzula će se preuzeti.

Stoga nam osobine pomažu u provedbi više nasljeđa bez nailaženja na dijamantni problem.

Prvo, kreirajmo dvije osobine metodom koja ima isti potpis:

osobina WalkingTrait {String basicAbility () {return "Walking !!" }} osobina SpeakingTrait {String basicAbility () {return "Speaking !!" }} 

Dalje, napišite klasu koja implementira obje osobine:

razred Pas implementira WalkingTrait, SpeakingTrait {} 

Jer SpeakingTrait proglašava se posljednjim, svojim basicAbility implementacija metode bi se prema zadanim postavkama pokupila u Pas razred.

8.2. Eksplicitno rješavanje sukoba

Sada, ako ne želimo jednostavno uzeti zadano rješavanje sukoba koje pruža jezik, možemo ga poništiti poizričito birajući koju metodu pozvati pomoću osobina.super.metoda referenca.

Na primjer, dodajmo još jednu metodu s istim potpisom u naše dvije osobine:

String speakAndWalk () {return "Hodaj i govori !!" }
String speakAndWalk () {return "Govori i hodaj !!" }

Sada, poništimo zadano rješavanje više sukoba nasljeđivanja u našem Pas razred koristeći super ključna riječ:

klasa Pas implementira WalkingTrait, SpeakingTrait {String speakAndWalk () {WalkingTrait.super.speakAndWalk ()}}

9. Implementacija osobina tijekom izvođenja

Za provedbu a osobina dinamički, možemo koristiti kao ključna riječ za prisiljavanje objekta na osobina za vrijeme izvođenja.

Na primjer, stvorimo AnimalTrait s basicBehaviour metoda:

osobina AnimalTrait {String basicBehavior () {return "Animalistic !!" }}

Da bismo implementirali nekoliko osobina odjednom, možemo koristiti withTraits metoda umjesto kao ključna riječ:

def dog = novi Pas () def dogWithTrait = dog.withTraits SpeakingTrait, WalkingTrait, AnimalTrait

10. Zaključak

U ovom smo članku vidjeli kako stvoriti osobine u Groovyu i istražili neke od njihovih korisnih značajki.

A osobina je stvarno učinkovit način za dodavanje uobičajenih implementacija i funkcionalnosti tijekom naših predavanja. Uz to, omogućuje nam smanjenje suvišnih kodova i olakšava održavanje koda.

Kao i obično, implementacije koda i jedinični testovi za ovaj članak dostupni su na GitHubu.


$config[zx-auto] not found$config[zx-overlay] not found