Groovy - Traços

Traços são uma construção estrutural da linguagem que permite -

  • Composição de comportamentos.
  • Implementação de interfaces em tempo de execução.
  • Compatibilidade com verificação / compilação de tipo estático

Eles podem ser vistos como interfaces que transportam implementações e estados padrão. Um trait é definido usando a palavra-chave trait.

Um exemplo de uma característica é dado abaixo -

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

Pode-se então usar a palavra-chave implementar para implementar o traço de maneira semelhante às 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;
}

Implementando Interfaces

As características podem implementar interfaces, caso em que as interfaces são declaradas usando a palavra-chave implements.

Um exemplo de característica que implementa uma interface é fornecido abaixo. No exemplo a seguir, os seguintes pontos-chave podem ser observados.

  • Uma interface Total é definida com o método DisplayTotal.

  • O traço Marks implementa a interface Total e, portanto, precisa fornecer uma implementação para o método 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;  
}

A saída do programa acima seria -

Display Marks 
Display Total

Propriedades

Um traço pode definir propriedades. Um exemplo de um traço com uma propriedade é dado abaixo.

No exemplo a seguir, o Marks1 do tipo inteiro é uma propriedade.

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

A saída do programa acima seria -

10 
Display Total

Composição de Comportamentos

As características podem ser usadas para implementar herança múltipla de maneira controlada, evitando o problema do diamante. No exemplo de código a seguir, definimos duas características -Marks e Total. Nossa classe de aluno implementa ambos os traços. Uma vez que a classe do aluno estende ambas as características, ela é capaz de acessar os dois métodos -DisplayMarks e 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 
}

A saída do programa acima seria -

Total 
Marks1

Traços de Extensão

Características podem estender outra característica, caso em que você deve usar o extendspalavra-chave. No exemplo de código a seguir, estamos estendendo o traço Total com o traço 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 
}

A saída do programa acima seria -

Total