Bevezetés a vonásokba Groovy-ban

1. Áttekintés

Ebben az oktatóanyagban a vonások fogalmát fogjuk felfedezni Groovy-ban. A Groovy 2.3 kiadásban mutatták be őket.

2. Mik a tulajdonságok?

A tulajdonságok olyan újrafelhasználható komponensek, amelyek olyan módszerek vagy viselkedésmódokat képviselnek, amelyekkel több osztály funkcionalitását bővíthetjük.

Emiatt, interfészeknek tekintik őket, alapértelmezett megvalósításokat és állapotot egyaránt hordoznak. Az összes tulajdonságot a jellemvonás kulcsszó.

3. Módszerek

A módszer deklarálása a jellemvonás hasonló az osztály bármely szabályos módszerének deklarálásához. Ugyanakkor nem nyilváníthatunk védett vagy csomag-privát módszereket a jellemvonás.

Nézzük meg, hogyan valósulnak meg az állami és a magán módszerek.

3.1. Nyilvános módszerek

Először feltárjuk, hogyan nyilvános a módszereket a jellemvonás.

Hozzunk létre egy jellemvonás nevezett UserTrait és a nyilvánosköszönj módszer:

tulajdonság UserTrait {String sayHello () {return "Hello!" }}

Ezt követően létrehozunk egy Munkavállaló osztály, amely megvalósítja UserTrait:

osztály Alkalmazott implementálja a UserTrait {}

Most hozzunk létre egy tesztet annak ellenőrzésére, hogy a Munkavállaló példány hozzáférhet a köszönés módszere UserTrait:

def 'Vissza kell adnia az msg karakterláncot, ha a Felhasználói tulajdonság által biztosított Employee.sayHello módszert használja' () {when: def msg = worker.sayHello () then: msg msg Például a karakterlánc állítsa be msg == "Hello!" }

3.2. Privát módszerek

Hozhatunk létre a magán módszer a jellemvonás és utalni rá egy másikban nyilvános módszer.

Lássuk a kód megvalósítását a UserTrait:

private String greetingMessage () {return 'Hello, privát módszerből!' } String üdvözlet () {def msg = greetingMessage () println msg return msg} 

Vegye figyelembe, hogy ha hozzáférünk a magán módszer a megvalósítási osztályban, akkor a MissingMethodException:

def 'Ha vissza kellene adnia a MissingMethodException-t, ha az Employee.greetingMessage metódust használja' () {when: def kivétel próbálkozzon a {worker.greetingMessage ()} fogással (e kivétel) {kivétel = e} akkor: kivétel kivétel groovy.lang.MissingMethodException kivételt állít. message == "Nincs a módszer aláírása: com.baeldung.traits.Employee.greetingMessage ()" + "használható argumentumtípusokra: () értékek: []"}

A jellemvonás, egy privát módszer elengedhetetlen lehet bármilyen megvalósításhoz, amelyet egyetlen osztály sem írhat felül, bár más nyilvános módszerek megkövetelik.

3.3. Absztrakt módszerek

A jellemvonás tartalmazhat absztrakt módszerek, amelyek ezt követően egy másik osztályban megvalósíthatók:

tulajdonság UserTrait {abstract String name () String showName () {return "Hello, $ {name ()}!" }}
osztály Alkalmazott implementálja a UserTrait {String name () {return 'Bob'}} 

3.4. Az alapértelmezett módszerek felülírása

Általában a jellemvonás a nyilvános metódusainak alapértelmezett megvalósítását tartalmazza, de felülírhatjuk azokat a megvalósítási osztályban:

vonás SpeakingTrait {String speak () {return "Speaking !!" }} 
osztály Kutya megvalósítja a SpeakingTrait {String speak () {return "Bow Bow !!" }} 

A tulajdonságok nem támogatják védett és magán hatókörök.

4. ez Kulcsszó

A. Viselkedése ez kulcsszó hasonló a Java-hoz. Megfontolhatjuk a jellemvonás mint a szuper osztály.

Például létrehozunk egy metódust, amely visszatér ez a jellemvonás:

tulajdonság UserTrait {def self () {return this}}

5. Interfészek

A jellemvonás interfészeket is megvalósíthat, csakúgy, mint a szokásos osztályok.

Hozzunk létre egy felület és megvalósítani a jellemvonás:

kezelőfelület Ember {String vezetéknév ()}
vonás A UserTrait megvalósítja az emberi {String showLastName () {return "Hello" Hello, $ {lastName ()}! " }}

Most hajtsuk végre a absztrakt módszere felület a megvalósítási osztályban:

osztály Alkalmazott implementálja a UserTrait {String vezetéknév () {return "Marley"}}

6. Tulajdonságok

Hozzáadhatunk tulajdonságokat a jellemvonás akárcsak bármelyik rendes osztályban:

vonás A UserTrait megvalósítja az emberi {karakterlánc e-mail karakterlánc címet}

7. A tulajdonságok kiterjesztése

Hasonló egy szokásos Groovy-hoz osztály, a jellemvonás meghosszabbíthat egy másikat jellemvonás használni a kiterjed kulcsszó:

vonás WheelTrait {int noOfWheels} vonás VehicleTrait kiterjeszti a WheelTrait {String showWheels () {return "Kerekek száma $ noOfWheels"}} osztályú autóeszközök VehicleTrait {}

Több vonást is kiterjeszthetünk a megvalósítja kikötés:

vonás AddressTrait {String residentialAddress} vonás EmailTrait {String email} vonás Személy végrehajtja a AddressTrait, EmailTrait {}

8. Többszörös öröklési konfliktusok

Amikor egy osztály két vagy több olyan tulajdonságot valósít meg, amelyek azonos aláírású módszerekkel rendelkeznek, akkor tudnunk kell a konfliktusok megoldását. Nézzük meg, hogyan oldja meg Groovy az ilyen konfliktusokat alapértelmezés szerint, valamint azt is, hogy miként írhatjuk felül az alapértelmezett felbontást.

8.1. Alapértelmezett konfliktuskezelés

Alapértelmezés szerint az utoljára deklarált módszer jellemvonás ban,-ben megvalósítja záradékot felvesszük.

Ezért a tulajdonságok segítenek abban, hogy többféle örökséget hajtsunk végre anélkül, hogy találkoznánk a Gyémánt problémával.

Először hozzunk létre két tulajdonságot egy azonos aláírású módszerrel:

vonás WalkingTrait {String basicAbility () {return "Walking !!" }} tulajdonság SpeakingTrait {String basicAbility () {return "Speaking !!" }} 

Ezután írjunk egy osztályt, amely mindkét tulajdonságot megvalósítja:

osztályú kutya megvalósítja a WalkingTrait, a SpeakingTrait {} 

Mivel SpeakingTrait utolsónak nyilvánítják, annak alapképesség A módszer megvalósítását alapértelmezés szerint a Kutya osztály.

8.2. Kifejezett konfliktuskezelés

Most, ha nem akarjuk egyszerűen elfogadni a nyelv által biztosított alapértelmezett konfliktusmegoldást, felülírhatjuk általkifejezetten a hívás módjának kiválasztása a tulajdonság.szuper.módszer referencia.

Például adjunk hozzá egy másik metódust ugyanazzal az aláírással a két tulajdonságunkhoz:

String speakAndWalk () {return "Sétálj és beszélj !!" }
String speakAndWalk () {return "Beszélj és járj !!" }

Most írjuk felül a több öröklési konfliktus alapértelmezett megoldását Kutya osztály a szuper kulcsszó:

osztályos kutya megvalósítja a WalkingTrait, SpeakingTrait {String speakAndWalk () {WalkingTrait.super.speakAndWalk ()}}

9. Jellemzők megvalósítása futás közben

A jellemvonás dinamikusan tudjuk használja a mint kulcsszó egy objektum kényszerítésére a jellemvonás futás közben.

Hozzunk létre például egy AnimalTrait a ... val alapviselkedés módszer:

tulajdonság AnimalTrait {String basicBehavior () {return "Animalistic !!" }}

Több tulajdonság egyszerre történő megvalósításához használhatjuk a a szokásokkal módszer helyett mint kulcsszó:

def kutya = új kutya () def kutyaWithTrait = kutya.Képzõkkel BeszédTrait, WalkingTrait, AnimalTrait

10. Következtetés

Ebben a cikkben megismerhettük, hogyan lehet vonásokat létrehozni a Groovy-ban, és felfedeztük néhány hasznos funkciójukat.

A jellemvonás egy igazán hatékony módszer a közös megvalósítások és funkciók hozzáadására az egész osztályunkban. Ezenkívül lehetővé teszi számunkra a redundáns kód minimalizálását és megkönnyíti a kód karbantartását.

Szokás szerint a cikk kód implementációi és egységtesztjei elérhetők a GitHubon.