Groovy - Orientato agli oggetti

In Groovy, come in qualsiasi altro linguaggio orientato agli oggetti, esiste il concetto di classi e oggetti per rappresentare la natura orientata agli oggetti del linguaggio di programmazione. Una classe Groovy è una raccolta di dati e dei metodi che operano su tali dati. Insieme, i dati ei metodi di una classe vengono utilizzati per rappresentare alcuni oggetti del mondo reale dal dominio del problema.

Una classe in Groovy dichiara lo stato (dati) e il comportamento degli oggetti definiti da quella classe. Quindi, una classe Groovy descrive sia i campi di istanza che i metodi per quella classe.

Di seguito è riportato un esempio di una classe in Groovy. Il nome della classe è Studente che ha due campi:StudentID e StudentName. Nella funzione main, stiamo creando un oggetto di questa classe e assegnando valori al fileStudentID e StudentName dell'oggetto.

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

Metodi getter e setter

In qualsiasi linguaggio di programmazione, è sempre una pratica nascondere i membri dell'istanza con la parola chiave private e fornire invece metodi getter e setter per impostare e ottenere di conseguenza i valori delle variabili di istanza. L'esempio seguente mostra come eseguire questa operazione.

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

Quando eseguiamo il programma sopra, otterremo il seguente risultato:

1 
Joe

Notare i seguenti punti chiave sul programma di cui sopra:

  • Nella classe sia studentID che studentName sono contrassegnati come privati, il che significa che non è possibile accedervi dall'esterno della classe.

  • Ogni membro dell'istanza ha il proprio metodo getter e setter. Il metodo getter restituisce il valore della variabile di istanza, ad esempio il metodo int getStudentID () e il metodo setter imposta il valore dell'ID istanza, ad esempio il metodo - void setStudentName (String pName)

Metodi di istanza

Normalmente è naturale includere più metodi all'interno della classe che effettivamente esegue una sorta di funzionalità per la classe. Nel nostro esempio di studente, aggiungiamo membri di istanza di Marks1, Marks2 e Marks3 per denotare i voti dello studente in 3 materie. Aggiungeremo quindi un nuovo metodo di istanza che calcolerà i voti totali dello studente. Di seguito è riportato l'aspetto del codice.

Nell'esempio seguente, il metodo Total è un metodo Instance aggiuntivo che ha una logica incorporata.

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

Quando eseguiamo il programma sopra, otterremo il seguente risultato:

60

Creazione di più oggetti

Si possono anche creare più oggetti di una classe. Di seguito è riportato l'esempio di come questo può essere ottenuto. Qui stiamo creando 3 oggetti (st, st1 e st2) e chiamando i loro membri di istanza e metodi di istanza di conseguenza.

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

Quando eseguiamo il programma sopra, otterremo il seguente risultato:

60 
70 
80

Eredità

L'ereditarietà può essere definita come il processo in cui una classe acquisisce le proprietà (metodi e campi) di un'altra. Con l'uso dell'ereditarietà le informazioni sono gestibili in ordine gerarchico.

La classe che eredita le proprietà di altri è nota come sottoclasse (classe derivata, classe figlia) e la classe le cui proprietà sono ereditate è nota come superclasse (classe base, classe genitore).

Si estende

extendsè la parola chiave utilizzata per ereditare le proprietà di una classe. Di seguito è riportata la sintassi della parola chiave extends. Nell'esempio seguente stiamo facendo le seguenti cose:

  • Creare una classe chiamata Person. Questa classe ha un membro dell'istanza chiamato nome.

  • Creazione di una classe chiamata Student che si estende dalla classe Person. Si noti che il membro dell'istanza del nome definito nella classe Person viene ereditato nella classe Student.

  • Nel costruttore della classe Student, stiamo chiamando il costruttore della classe base.

  • Nella nostra classe Student, stiamo aggiungendo 2 membri di istanza aggiuntivi di StudentID e 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();
   } 
}

Quando eseguiamo il programma sopra, otterremo il seguente risultato:

Joe

Classi interne

Le classi interne sono definite all'interno di altre classi. La classe che la racchiude può usare la classe interna come al solito. Dall'altro lato, una classe interna può accedere ai membri della sua classe che lo racchiude, anche se sono privati. Le classi diverse dalla classe inclusa non possono accedere alle classi interne.

Di seguito è riportato un esempio di una classe esterna e interna. Nell'esempio seguente stiamo facendo le seguenti cose:

  • Creazione di una classe chiamata Outer che sarà la nostra classe esterna.
  • Definizione di una stringa chiamata nome nella nostra classe Outer.
  • Creazione di una classe interna o nidificata all'interno della nostra classe esterna.
  • Si noti che nella classe interna siamo in grado di accedere al membro dell'istanza del nome definito nella 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); 
      } 
   } 
	
}

Quando eseguiamo il programma sopra, otterremo il seguente risultato:

Joe

Classi astratte

Le classi astratte rappresentano concetti generici, quindi non possono essere istanziate, essendo create per essere sottoclasse. I loro membri includono campi / proprietà e metodi astratti o concreti. I metodi astratti non hanno implementazione e devono essere implementati da sottoclassi concrete. Le classi astratte devono essere dichiarate con la parola chiave abstract. Anche i metodi astratti devono essere dichiarati con la parola chiave abstract.

Nell'esempio seguente, notare che la classe Person è ora trasformata in una classe astratta e non può essere istanziata. Si noti inoltre che esiste un metodo astratto chiamato DisplayMarks nella classe abstract che non ha dettagli di implementazione. Nella classe studente è obbligatorio aggiungere i dettagli di implementazione.

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

Quando eseguiamo il programma sopra, otterremo il seguente risultato:

Joe 
10 
null

Interfacce

Un'interfaccia definisce un contratto a cui una classe deve conformarsi. Un'interfaccia definisce solo un elenco di metodi che devono essere implementati, ma non definisce l'implementazione dei metodi. Un'interfaccia deve essere dichiarata utilizzando la parola chiave interface. Un'interfaccia definisce solo le firme del metodo. I metodi di un'interfaccia sono semprepublic. È un errore utilizzare metodi protetti o privati ​​nelle interfacce.

Di seguito è riportato un esempio di un'interfaccia in groovy. Nell'esempio seguente stiamo facendo le seguenti cose:

  • Creazione di un'interfaccia denominata Marks e creazione di un metodo di interfaccia denominato DisplayMarks.

  • Nella definizione della classe, stiamo usando la parola chiave implements per implementare l'interfaccia.

  • Poiché stiamo implementando l'interfaccia, dobbiamo fornire l'implementazione per il metodo 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);
   }
}

Quando eseguiamo il programma sopra, otterremo il seguente risultato:

10
null