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