Groovy - Traits

  • 简述

    特征是语言的结构构造,它允许 -
    • 行为(方法)的组成。
    • 接口的运行时实现。
    • 与静态类型检查/编译的兼容性
    它们可以被看作是携带默认实现和状态的接口。使用 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
    
  • 行为的构成

    特征可用于以受控方式实现多重继承,避免菱形问题。在下面的代码示例中,我们定义了两个特征 - MarksTotal。我们的 Student 类实现了这两个特征。由于学生类扩展了这两个特征,它能够访问这两个方法——DisplayMarksDisplayTotal
    
    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