Groovy-traits

提供:Dev Guides
移動先:案内検索

グルーヴィー-特性

特性は、許可する言語の構造的な構成です-

  • 行動の構成。
  • インターフェイスのランタイム実装。
  • 静的型チェック/コンパイルとの互換性

これらは、デフォルトの実装と状態の両方を保持するインターフェースと見なすことができます。 特性は、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 の2つの特性を定義しています。 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