Groovy (特征)

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

  • 行为的组成。
  • 接口的运行时实现。
  • 与静态类型检查/编译的兼容性
    它们可以被看作是承载默认实现和状态的接口。使用trait关键字定义 trait。

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

package com.klvchen.test2

class TraitTest {
	static void main(String[] args) {
		Student st = new Student();
		st.studentID = 1;
		st.marks1 = 10;
		st.DisplayMarks();
	}
}

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

class Student implements Marks{
	int studentID;
	int marks1;
}

实现接口

Traits 可以实现接口,在这种情况下,使用 interface 关键字声明接口。下面给出了实现接口的特征的示例。在以下示例中,可以注意以下要点。

  • 接口 Total 使用方法 DisplayTotal 定义。
  • 特征 Marks 实现了 Total 接口,因此需要为 DisplayTotal 方法提供一个实现。
package com.klvchen.test2

class TraitTest {
	static void main(String[] args) {
		Student st = new Student();
		st.studentID = 1;
		st.marks1 = 10;
		
		st.DisplayMarks();
		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;
}

属性

特征可以定义属性。下面给出了具有属性的 trait 的示例。
在以下示例中,integer 类型的 marks1 是一个属性。

package com.klvchen.test2

class TraitTest {
	static void main(String[] args) {
		Student st = new Student();
		st.studentID = 1;
		
		st.DisplayMarks();
		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;
}

行为的构成

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

package com.klvchen.test2

class TraitTest {
	static void main(String[] args) {
		Student st = new Student();
		st.studentID = 1;
		
		st.DisplayMarks();
		st.DisplayTotal();
	}
}

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

}

trait Total{
	void DisplayTotal() {
		println("Total");
	}
}

class Student implements Marks,Total{
	int studentID;
}

扩展特征

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

package com.klvchen.test2

class TraitTest {
	static void main(String[] args) {
		Student st = new Student();
		st.studentID = 1;
		
		st.DisplayMarks();
	}
}

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

}

trait Total extends Marks{
	void DisplayMarks() {
		println("Total");
	}
}

class Student implements Total{
	int studentID;
}

posted @ 2021-03-27 10:51  klvchen  阅读(98)  评论(0)    收藏  举报