Groovy - Traits

Les traits sont une construction structurelle du langage qui permet -

  • Composition des comportements.
  • Implémentation à l'exécution des interfaces.
  • Compatibilité avec la vérification / compilation de type statique

Ils peuvent être considérés comme des interfaces portant à la fois des implémentations et un état par défaut. Un trait est défini à l'aide du mot-clé trait.

Un exemple de trait est donné ci-dessous -

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

On peut ensuite utiliser le mot-clé implémenter pour implémenter le trait de la même manière que les interfaces.

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;
}

Implémentation d'interfaces

Les traits peuvent implémenter des interfaces, auquel cas les interfaces sont déclarées à l'aide du mot clé implements.

Un exemple de trait implémentant une interface est donné ci-dessous. Dans l'exemple suivant, les points clés suivants peuvent être notés.

  • Une interface Total est définie avec la méthode DisplayTotal.

  • Le trait Marks implémente l'interface Total et doit donc fournir une implémentation pour la méthode 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;  
}

La sortie du programme ci-dessus serait -

Display Marks 
Display Total

Propriétés

Un trait peut définir des propriétés. Un exemple de trait avec une propriété est donné ci-dessous.

Dans l'exemple suivant, le Marks1 de type integer est une propriété.

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 
   }
}

La sortie du programme ci-dessus serait -

10 
Display Total

Composition des comportements

Les traits peuvent être utilisés pour implémenter l'héritage multiple de manière contrôlée, évitant ainsi le problème du diamant. Dans l'exemple de code suivant, nous avons défini deux traits -Marks et Total. Notre classe Student implémente les deux traits. Étant donné que la classe d'étudiants étend les deux traits, elle peut accéder aux deux méthodes -DisplayMarks et 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 
}

La sortie du programme ci-dessus serait -

Total 
Marks1

Extension des traits

Les traits peuvent étendre un autre trait, auquel cas vous devez utiliser le extendsmot-clé. Dans l'exemple de code suivant, nous étendons le trait Total avec le trait 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 
}

La sortie du programme ci-dessus serait -

Total