Groovy - cechy
Cechy są konstrukcją strukturalną języka, która pozwala -
- Kompozycja zachowań.
- Implementacja interfejsów w czasie rzeczywistym.
- Zgodność ze statycznym sprawdzaniem / kompilacją typów
Można je postrzegać jako interfejsy przenoszące zarówno domyślne implementacje, jak i stan. Cecha jest definiowana za pomocą słowa kluczowego cecha.
Przykład cechy podano poniżej -
trait Marks {
void DisplayMarks() {
println("Display Marks");
}
}
Następnie można użyć słowa kluczowego implement, aby zaimplementować cechę w podobny sposób, jak w przypadku interfejsów.
class Example {
static void main(String[] args) {
Student st = new Student();
st.StudentID = 1;
st.Marks1 = 10;
println(st.DisplayMarks());
}
}
trait Marks {
void DisplayMarks() {
println("Display Marks");
}
}
class Student implements Marks {
int StudentID
int Marks1;
}
Implementowanie interfejsów
Cechy mogą implementować interfejsy, w którym to przypadku interfejsy są deklarowane przy użyciu słowa kluczowego implements.
Poniżej podano przykład cechy implementującej interfejs. W poniższym przykładzie można zauważyć następujące kluczowe punkty.
Interfejs Total jest definiowany za pomocą metody DisplayTotal.
Cecha Marks implementuje interfejs Total i dlatego musi zapewnić implementację metody DisplayTotal.
class Example {
static void main(String[] args) {
Student st = new Student();
st.StudentID = 1;
st.Marks1 = 10;
println(st.DisplayMarks());
println(st.DisplayTotal());
}
}
interface Total {
void DisplayTotal()
}
trait Marks implements Total {
void DisplayMarks() {
println("Display Marks");
}
void DisplayTotal() {
println("Display Total");
}
}
class Student implements Marks {
int StudentID
int Marks1;
}
Wynik powyższego programu byłby -
Display Marks
Display Total
Nieruchomości
Cecha może określać właściwości. Poniżej podano przykład cechy posiadającej właściwość.
W poniższym przykładzie właściwość Marks1 typu integer jest.
class Example {
static void main(String[] args) {
Student st = new Student();
st.StudentID = 1;
println(st.DisplayMarks());
println(st.DisplayTotal());
}
interface Total {
void DisplayTotal()
}
trait Marks implements Total {
int Marks1;
void DisplayMarks() {
this.Marks1 = 10;
println(this.Marks1);
}
void DisplayTotal() {
println("Display Total");
}
}
class Student implements Marks {
int StudentID
}
}
Wynik powyższego programu byłby -
10
Display Total
Skład zachowań
Cechy można wykorzystać do implementacji wielokrotnego dziedziczenia w kontrolowany sposób, unikając problemu diamentów. W poniższym przykładzie kodu zdefiniowaliśmy dwie cechy -Marks i Total. Nasza klasa Student realizuje obie cechy. Ponieważ klasa ucznia rozszerza obie cechy, jest w stanie uzyskać dostęp do obu metod -DisplayMarks i DisplayTotal.
class Example {
static void main(String[] args) {
Student st = new Student();
st.StudentID = 1;
println(st.DisplayMarks());
println(st.DisplayTotal());
}
}
trait Marks {
void DisplayMarks() {
println("Marks1");
}
}
trait Total {
void DisplayTotal() {
println("Total");
}
}
class Student implements Marks,Total {
int StudentID
}
Wynik powyższego programu byłby -
Total
Marks1
Rozszerzające cechy
Cechy mogą rozszerzyć inną cechę, w takim przypadku musisz użyć extendssłowo kluczowe. W poniższym przykładzie kodu rozszerzamy cechę Total o cechę Marks.
class Example {
static void main(String[] args) {
Student st = new Student();
st.StudentID = 1;
println(st.DisplayMarks());
}
}
trait Marks {
void DisplayMarks() {
println("Marks1");
}
}
trait Total extends Marks {
void DisplayMarks() {
println("Total");
}
}
class Student implements Total {
int StudentID
}
Wynik powyższego programu byłby -
Total