二十二、Groovy 特征

二十二、Groovy 特征

特征是语言的结构构造,允许 –

  • 行为的组成。
  • 接口的运行时实现。
  • 与静态类型检查/编译的兼容性

它们可以被看作是承载默认实现和状态的接口。使用trait关键字定义trait。

下面给出了一个特征的例子:

1
2
3
4
5
trait Marks {
void DisplayMarks() {
println("Display Marks");
}
}

然后可以使用implement关键字以类似于接口的方式实现trait。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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;
}

实现接口

Traits可以实现接口,在这种情况下,使用implements关键字声明接口。

下面给出了实现接口的特征的示例。在以下示例中,可以注意以下要点。

  • 接口Total使用方法DisplayTotal定义。
  • 特征Marks实现了Total接口,因此需要为DisplayTotal方法提供一个实现。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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;
}

上述程序的输出将是 –

1
2
Display Marks 
Display Total

属性

特征可以定义属性。下面给出了具有属性的trait的示例。

在以下示例中,integer类型的Marks1是一个属性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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
}
}

上述程序的输出将是 –

1
2
10 
Display Total

行为的构成

特征可以用于以受控的方式实现多重继承,避免钻石问题。在下面的代码示例中,我们定义了两个特征 – Marks和Total。我们的Student类实现了两个特征。由于学生类扩展了这两个特征,它能够访问这两种方法 – DisplayMarks和DisplayTotal。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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
}

上述程序的输出将是 –

1
2
Total 
Marks1

扩展特征

特征可能扩展另一个特征,在这种情况下,必须使用extends关键字。在下面的代码示例中,我们使用Marks trait扩展了Total trait。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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
}

上述程序的输出将是 –

1
Total