Groovy - Orienté objet

Dans Groovy, comme dans tout autre langage orienté objet, il existe le concept de classes et d'objets pour représenter la nature orientée objet du langage de programmation. Une classe Groovy est une collection de données et les méthodes qui opèrent sur ces données. Ensemble, les données et les méthodes d'une classe sont utilisées pour représenter un objet du monde réel du domaine du problème.

Une classe dans Groovy déclare l'état (données) et le comportement des objets définis par cette classe. Par conséquent, une classe Groovy décrit à la fois les champs d'instance et les méthodes de cette classe.

Voici un exemple de classe dans Groovy. Le nom de la classe est Student qui a deux champs -StudentID et StudentName. Dans la fonction principale, nous créons un objet de cette classe et attribuons des valeurs auStudentID et StudentName de l'objet.

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

Méthodes getter et setter

Dans tout langage de programmation, il est toujours pratique de masquer les membres de l'instance avec le mot clé private et de fournir à la place des méthodes getter et setter pour définir et obtenir les valeurs des variables d'instance en conséquence. L'exemple suivant montre comment cela peut être fait.

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

Lorsque nous exécutons le programme ci-dessus, nous obtiendrons le résultat suivant -

1 
Joe

Notez les points clés suivants concernant le programme ci-dessus -

  • Dans la classe, le studentID et le studentName sont marqués comme privés, ce qui signifie qu'ils ne sont pas accessibles depuis l'extérieur de la classe.

  • Chaque membre d'instance a sa propre méthode getter et setter. La méthode getter renvoie la valeur de la variable d'instance, par exemple la méthode int getStudentID () et la méthode setter définit la valeur de l'ID d'instance, par exemple la méthode - void setStudentName (String pName)

Méthodes d'instance

Il est normalement naturel d'inclure plus de méthodes à l'intérieur de la classe, ce qui en fait une sorte de fonctionnalité pour la classe. Dans notre exemple d'élève, ajoutons des membres d'instance de Marks1, Marks2 et Marks3 pour désigner les notes de l'élève dans 3 matières. Nous ajouterons ensuite une nouvelle méthode d'instance qui calculera les notes totales de l'étudiant. Voici à quoi ressemblerait le code.

Dans l'exemple suivant, la méthode Total est une méthode Instance supplémentaire qui intègre une certaine logique.

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

Lorsque nous exécutons le programme ci-dessus, nous obtiendrons le résultat suivant -

60

Création de plusieurs objets

On peut également créer plusieurs objets d'une classe. Voici l'exemple de la façon dont cela peut être réalisé. Ici, nous créons 3 objets (st, st1 et st2) et appelons leurs membres d'instance et leurs méthodes d'instance en conséquence.

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

Lorsque nous exécutons le programme ci-dessus, nous obtiendrons le résultat suivant -

60 
70 
80

Héritage

L'héritage peut être défini comme le processus par lequel une classe acquiert les propriétés (méthodes et champs) d'une autre. Avec l'utilisation de l'héritage, les informations sont gérables dans un ordre hiérarchique.

La classe qui hérite des propriétés des autres est appelée sous-classe (classe dérivée, classe enfant) et la classe dont les propriétés sont héritées est appelée superclasse (classe de base, classe parent).

Prolonge

extendsest le mot-clé utilisé pour hériter des propriétés d'une classe. La syntaxe du mot-clé extend est donnée ci-dessous. Dans l'exemple suivant, nous faisons les choses suivantes -

  • Création d'une classe appelée Person. Cette classe a un membre d'instance appelé nom.

  • Création d'une classe appelée Student qui s'étend à partir de la classe Person. Notez que le membre de l'instance de nom défini dans la classe Person est hérité dans la classe Student.

  • Dans le constructeur de classe Student, nous appelons le constructeur de classe de base.

  • Dans notre classe Student, nous ajoutons 2 membres d'instance supplémentaires de StudentID et Marks1.

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

Lorsque nous exécutons le programme ci-dessus, nous obtiendrons le résultat suivant -

Joe

Classes intérieures

Les classes internes sont définies dans d'autres classes. La classe englobante peut utiliser la classe interne comme d'habitude. De l'autre côté, une classe interne peut accéder aux membres de sa classe englobante, même s'ils sont privés. Les classes autres que la classe englobante ne sont pas autorisées à accéder aux classes internes.

Voici un exemple de classe externe et interne. Dans l'exemple suivant, nous faisons les choses suivantes -

  • Création d'une classe appelée Outer qui sera notre classe externe.
  • Définition d'une chaîne appelée nom dans notre classe Outer.
  • Création d'une classe interne ou imbriquée à l'intérieur de notre classe externe.
  • Notez que dans la classe interne, nous pouvons accéder au membre de l'instance de nom défini dans la classe 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); 
      } 
   } 
	
}

Lorsque nous exécutons le programme ci-dessus, nous obtiendrons le résultat suivant -

Joe

Classes abstraites

Les classes abstraites représentent des concepts génériques, par conséquent, elles ne peuvent pas être instanciées, étant créées pour être sous-classées. Leurs membres comprennent des champs / propriétés et des méthodes abstraites ou concrètes. Les méthodes abstraites n'ont pas d'implémentation et doivent être implémentées par des sous-classes concrètes. Les classes abstraites doivent être déclarées avec un mot-clé abstrait. Les méthodes abstraites doivent également être déclarées avec un mot-clé abstrait.

Dans l'exemple suivant, notez que la classe Person est désormais transformée en classe abstraite et ne peut pas être instanciée. Notez également qu'il existe une méthode abstraite appelée DisplayMarks dans la classe abstraite qui n'a pas de détails d'implémentation. Dans la classe des étudiants, il est obligatoire d'ajouter les détails d'implémentation.

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

Lorsque nous exécutons le programme ci-dessus, nous obtiendrons le résultat suivant -

Joe 
10 
null

Interfaces

Une interface définit un contrat auquel une classe doit se conformer. Une interface définit uniquement une liste de méthodes qui doivent être implémentées, mais ne définit pas l'implémentation des méthodes. Une interface doit être déclarée à l'aide du mot-clé interface. Une interface définit uniquement les signatures de méthode. Les méthodes d'une interface sont toujourspublic. C'est une erreur d'utiliser des méthodes protégées ou privées dans les interfaces.

Voici un exemple d'interface dans groovy. Dans l'exemple suivant, nous faisons les choses suivantes -

  • Création d'une interface appelée Marks et création d'une méthode d'interface appelée DisplayMarks.

  • Dans la définition de classe, nous utilisons le mot clé implements pour implémenter l'interface.

  • Parce que nous implémentons l'interface, nous devons fournir l'implémentation de la méthode 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);
   }
}

Lorsque nous exécutons le programme ci-dessus, nous obtiendrons le résultat suivant -

10
null