Учебники

Groovy — Черты

Черты являются структурной конструкцией языка, которая позволяет —

  • Композиция поведения.
  • Реализация интерфейсов во время выполнения.
  • Совместимость со статической проверкой типов / компиляцией

Их можно рассматривать как интерфейсы, несущие как реализации по умолчанию, так и состояние. Черта определяется с помощью ключевого слова trait.

Пример черты приведен ниже —

trait Marks {
   void DisplayMarks() {
      println("Display Marks");
   } 
}

Затем можно использовать ключевое слово Implement для реализации черты аналогично интерфейсам.

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.

Пример особенности реализации интерфейса приведен ниже. В следующем примере можно отметить следующие ключевые моменты.

  • Интерфейс Total определяется методом DisplayTotal.

  • Признаки черты реализуют интерфейс Total и, следовательно, должны обеспечить реализацию для метода DisplayTotal.

Интерфейс Total определяется методом DisplayTotal.

Признаки черты реализуют интерфейс Total и, следовательно, должны обеспечить реализацию для метода DisplayTotal.

Live Demo

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 типа integer является свойством.

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 . Наш Студенческий класс реализует обе черты. Так как ученический класс расширяет обе черты, он может получить доступ к обоим методам — DisplayMarks и DisplayTotal .

Live Demo

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.

Live Demo

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 
}

Результатом вышеупомянутой программы будет —