Groovy - черты характера
Черты - это структурная конструкция языка, которая позволяет:
- Состав поведения.
- Реализация интерфейсов во время выполнения.
- Совместимость с проверкой / компиляцией статического типа
Их можно рассматривать как интерфейсы, несущие как реализации по умолчанию, так и состояние. Признак определяется с помощью ключевого слова trait.
Пример черты приведен ниже -
trait Marks {
void DisplayMarks() {
println("Display Marks");
}
}
Затем можно использовать ключевое слово реализации, чтобы реализовать черту так же, как интерфейсы.
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;
}
Реализация интерфейсов
Черты могут реализовывать интерфейсы, и в этом случае интерфейсы объявляются с использованием ключевого слова Implements.
Ниже приведен пример трейта, реализующего интерфейс. В следующем примере можно отметить следующие ключевые моменты.
Итого интерфейса определяется методом DisplayTotal.
Признак Marks реализует интерфейс Total и, следовательно, должен предоставить реализацию для метода 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;
}
Результатом вышеуказанной программы будет -
Display Marks
Display Total
Свойства
Признак может определять свойства. Ниже приводится пример признака со свойством.
В следующем примере Marks1 целочисленного типа является свойством.
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
}
}
Результатом вышеуказанной программы будет -
10
Display Total
Состав поведения
Черты можно использовать для реализации множественного наследования контролируемым образом, избегая проблемы с ромбами. В следующем примере кода мы определили две черты:Marks и Total. В нашем классе Student реализованы обе черты. Поскольку класс ученика расширяет обе черты, он может получить доступ к обоим методам -DisplayMarks и 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
}
Результатом вышеуказанной программы будет -
Total
Marks1
Расширение черт
Черты могут расширять другую черту, и в этом случае вы должны использовать extendsключевое слово. В следующем примере кода мы расширяем типаж Total с помощью трейта 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
}
Результатом вышеуказанной программы будет -
Total