Groovy-object-oriented

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

Groovy-オブジェクト指向

Groovyでは、他のオブジェクト指向言語と同様に、プログラミング言語のオブジェクト指向の性質を表すクラスとオブジェクトの概念があります。 Groovyクラスは、データとそのデータを操作するメソッドのコレクションです。 一緒に、クラスのデータとメソッドを使用して、問題領域の現実世界のオブジェクトを表します。

Groovyのクラスは、そのクラスで定義されたオブジェクトの状態(データ)と動作を宣言します。 したがって、Groovyクラスは、そのクラスのインスタンスフィールドとメソッドの両方を記述します。

以下は、Groovyのクラスの例です。 クラスの名前は、 StudentIDStudentName の2つのフィールドがあるStudentです。 メイン関数では、このクラスのオブジェクトを作成し、オブジェクトの StudentID および StudentName に値を割り当てています。

class Student {
   int StudentID;
   String StudentName;

   static void main(String[] args) {
      Student st = new Student();
      st.StudentID = 1;
      st.StudentName = "Joe"
   }
}

getterおよびsetterメソッド

プログラミング言語では、常にprivateキーワードでインスタンスメンバーを非表示にし、代わりにgetterおよびsetterメソッドを提供して、それに応じてインスタンス変数の値を設定および取得します。 次の例は、これを行う方法を示しています。

class Student {
   private int StudentID;
   private String StudentName;

   void setStudentID(int pID) {
      StudentID = pID;
   }

   void setStudentName(String pName) {
      StudentName = pName;
   }

   int getStudentID() {
      return this.StudentID;
   }

   String getStudentName() {
      return this.StudentName;
   }

   static void main(String[] args) {
      Student st = new Student();
      st.setStudentID(1);
      st.setStudentName("Joe");

      println(st.getStudentID());
      println(st.getStudentName());
   }
}

上記のプログラムを実行すると、次の結果が得られます-

1
Joe

上記のプログラムに関する以下のキーポイントに注意してください-

  • クラスでは、studentIDとstudentNameの両方がプライベートとしてマークされています。つまり、クラスの外部からアクセスすることはできません。
  • 各インスタンスメンバーには、独自のgetterおよびsetterメソッドがあります。 getterメソッドは、インスタンス変数の値、たとえばメソッドint getStudentID()を返し、setterメソッドはインスタンスIDの値を設定します。たとえば、メソッド-void setStudentName(String pName)

インスタンスメソッド

通常、クラス内で実際にクラスに対して何らかの機能を実行するメソッドを追加するのは自然なことです。 生徒の例では、Marks1、Marks2、Marks3のインスタンスメンバーを追加して、3つの科目で生徒のマークを示します。 次に、学生の合計点を計算する新しいインスタンスメソッドを追加します。 コードは次のようになります。

次の例では、メソッドTotalは、いくつかのロジックが組み込まれた追加のインスタンスメソッドです。

class Student {
   int StudentID;
   String StudentName;

   int Marks1;
   int Marks2;
   int Marks3;

   int Total() {
      return Marks1+Marks2+Marks3;
   }

   static void main(String[] args) {
      Student st = new Student();
      st.StudentID = 1;
      st.StudentName="Joe";

      st.Marks1 = 10;
      st.Marks2 = 20;
      st.Marks3 = 30;

      println(st.Total());
   }
}

上記のプログラムを実行すると、次の結果が得られます-

60

複数のオブジェクトを作成する

クラスの複数のオブジェクトを作成することもできます。 以下は、これを実現する方法の例です。 ここでは、3つのオブジェクト(st、st1、st2)を作成し、それに応じてインスタンスメンバーとインスタンスメソッドを呼び出しています。

class Student {
   int StudentID;
   String StudentName;

   int Marks1;
   int Marks2;
   int Marks3;

   int Total() {
      return Marks1+Marks2+Marks3;
   }

   static void main(String[] args) {
      Student st = new Student();
      st.StudentID = 1;
      st.StudentName = "Joe";

      st.Marks1 = 10;
      st.Marks2 = 20;
      st.Marks3 = 30;

      println(st.Total());

      Student st1 = new Student();
      st.StudentID = 1;
      st.StudentName = "Joe";

      st.Marks1 = 10;
      st.Marks2 = 20;
      st.Marks3 = 40;

      println(st.Total());

      Student st3 = new Student();
      st.StudentID = 1;
      st.StudentName = "Joe";

      st.Marks1 = 10;
      st.Marks2 = 20;
      st.Marks3 = 50;

      println(st.Total());
   }
}

上記のプログラムを実行すると、次の結果が得られます-

60
70
80

継承

継承は、あるクラスが別のクラスのプロパティ(メソッドとフィールド)を取得するプロセスとして定義できます。 継承を使用すると、情報は階層的な順序で管理可能になります。

他のプロパティを継承するクラスはサブクラス(派生クラス、子クラス)と呼ばれ、プロパティが継承されるクラスはスーパークラス(ベースクラス、親クラス)と呼ばれます。

拡張する

*extends* は、クラスのプロパティを継承するために使用されるキーワードです。 以下はextendsキーワードの構文です。 次の例では、次のことを行っています-
  • Personというクラスを作成します。 このクラスには、nameという1つのインスタンスメンバーがあります。
  • Personクラスから拡張されるStudentというクラスを作成します。 Personクラスで定義されている名前インスタンスメンバーは、Studentクラスで継承されることに注意してください。
  • Studentクラスのコンストラクターでは、基本クラスのコンストラクターを呼び出しています。
  • Studentクラスでは、StudentIDとMarks1の2つのインスタンスメンバーを追加しています。
class Example {
   static void main(String[] args) {
      Student st = new Student();
      st.StudentID = 1;

      st.Marks1 = 10;
      st.name = "Joe";

      println(st.name);
   }
}

class Person {
   public String name;
   public Person() {}
}

class Student extends Person {
   int StudentID
   int Marks1;

   public Student() {
      super();
   }
}

上記のプログラムを実行すると、次の結果が得られます-

Joe

内部クラス

内部クラスは別のクラス内で定義されます。 エンクロージングクラスは、通常どおり内部クラスを使用できます。 一方、内部クラスは、プライベートクラスであっても、それを含むクラスのメンバーにアクセスできます。 外側のクラス以外のクラスは、内部クラスにアクセスできません。

以下は、OuterおよびInnerクラスの例です。 次の例では、次のことを行っています-

  • 外部クラスとなるOuterというクラスを作成します。
  • Outerクラスでnameという名前の文字列を定義します。
  • Outerクラス内にInnerクラスまたはネストされたクラスを作成します。
  • 内部クラスでは、Outerクラスで定義された名前インスタンスメンバーにアクセスできることに注意してください。
class Example {
   static void main(String[] args) {
      Outer outobj = new Outer();
      outobj.name = "Joe";
      outobj.callInnerMethod()
   }
}

class Outer {
   String name;

   def callInnerMethod() {
      new Inner().methodA()
   }

   class Inner {
      def methodA() {
         println(name);
      }
   }

}

上記のプログラムを実行すると、次の結果が得られます-

Joe

抽象クラス

抽象クラスは一般的な概念を表すため、インスタンス化することはできず、サブクラス化するために作成されます。 それらのメンバーには、フィールド/プロパティと抽象メソッドまたは具象メソッドが含まれます。 抽象メソッドには実装がなく、具体的なサブクラスによって実装する必要があります。 抽象クラスは、抽象キーワードで宣言する必要があります。 抽象メソッドも抽象キーワードで宣言する必要があります。

次の例では、Personクラスが抽象クラスになり、インスタンス化できないことに注意してください。 また、抽象クラスにはDisplayMarksという抽象メソッドがあり、実装の詳細はありません。 学生クラスでは、実装の詳細を追加することが必須です。

class Example {
   static void main(String[] args) {
      Student st = new Student();
      st.StudentID = 1;

      st.Marks1 = 10;
      st.name="Joe";

      println(st.name);
      println(st.DisplayMarks());
   }
}

abstract class Person {
   public String name;
   public Person() { }
   abstract void DisplayMarks();
}

class Student extends Person {
   int StudentID
   int Marks1;

   public Student() {
      super();
   }

   void DisplayMarks() {
      println(Marks1);
   }
}

上記のプログラムを実行すると、次の結果が得られます-

Joe
10
null

インターフェース

インターフェイスは、クラスが準拠する必要があるコントラクトを定義します。 インターフェイスは、実装が必要なメソッドのリストを定義するだけで、メソッドの実装は定義しません。 インターフェイスは、interfaceキーワードを使用して宣言する必要があります。 インターフェイスはメソッドシグネチャのみを定義します。 インターフェイスのメソッドは常に public です。 インターフェイスで保護されたメソッドまたはプライベートメソッドを使用するとエラーになります。

以下は、groovyのインターフェースの例です。 次の例では、次のことを行っています-

  • Marksというインターフェイスを作成し、DisplayMarksというインターフェイスメソッドを作成します。
  • クラス定義では、implementsキーワードを使用してインターフェイスを実装しています。
  • インターフェイスを実装しているため、DisplayMarksメソッドの実装を提供する必要があります。
class Example {
   static void main(String[] args) {
      Student st = new Student();
      st.StudentID = 1;
      st.Marks1 = 10;
      println(st.DisplayMarks());
   }
}

interface Marks {
   void DisplayMarks();
}

class Student implements Marks {
   int StudentID
   int Marks1;

   void DisplayMarks() {
      println(Marks1);
   }
}

上記のプログラムを実行すると、次の結果が得られます-

10
null