Groovy - 特性



特性是语言的结构构造,允许:

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

它们可以被视为包含默认实现和状态的接口。使用 trait 关键字定义特性。

下面给出一个特性的示例:

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

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

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

实现接口

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

下面给出一个特性实现接口的示例。在下面的示例中,可以注意到以下关键点。

  • 定义了一个名为 Total 的接口,其中包含 DisplayTotal 方法。

  • 特性 Marks 实现 Total 接口,因此需要为 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;  
} 

上述程序的输出将是:

Display Marks 
Display Total

属性

特性可以定义属性。下面给出一个包含属性的特性的示例。

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

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

上述程序的输出将是:

10 
Display Total

行为组合

特性可用于以受控的方式实现多重继承,避免菱形问题。在以下代码示例中,我们定义了两个特性 - **Marks** 和 **Total**。我们的 Student 类实现了这两个特性。由于 student 类扩展了这两个特性,因此它能够访问这两个方法 - **DisplayMarks** 和 **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 
}   

上述程序的输出将是:

Total 
Marks1

扩展特性

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

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 
}

上述程序的输出将是:

Total
广告