📜  Groovy-特性

📅  最后修改于: 2020-11-04 06:45:47             🧑  作者: Mango


特质是该语言的结构性结构,可允许-

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

它们可以看作是既带有默认实现又带有状态的接口。使用trait关键字定义一个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方法定义的。

  • 特征标记实现了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 。我们的学生班兼顾了这两个特点。由于学生班级扩展了这两种特征,因此它可以访问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

延长性状

特质可能会扩展另一个特征,在这种情况下,您必须使用extend关键字。在下面的代码示例中,我们使用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