Groovy - объектно-ориентированный

В Groovy, как и в любом другом объектно-ориентированном языке, существует концепция классов и объектов, отражающая объектно-ориентированную природу языка программирования. Класс Groovy - это набор данных и методы, которые работают с этими данными. Вместе данные и методы класса используются для представления некоторого объекта реального мира из проблемной области.

Класс в Groovy объявляет состояние (данные) и поведение объектов, определенных этим классом. Следовательно, класс Groovy описывает как поля экземпляра, так и методы этого класса.

Ниже приведен пример класса в Groovy. Имя класса - Студент, у которого есть два поля -StudentID и StudentName. В основной функции мы создаем объект этого класса и присваиваем значения объектуStudentID и StudentName объекта.

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

Методы получения и установки

На любом языке программирования всегда практикуется скрывать члены экземпляра с помощью ключевого слова private и вместо этого предоставлять методы получения и установки для установки и получения значений переменных экземпляра соответственно. В следующем примере показано, как это можно сделать.

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 помечены как частные, что означает, что к ним нельзя получить доступ извне класса.

  • Каждый член экземпляра имеет свой собственный метод получения и установки. Метод получения возвращает значение переменной экземпляра, например метод int getStudentID (), а метод установки устанавливает значение идентификатора экземпляра, например метод - 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.

  • Создание класса Student, который является наследником класса Person. Обратите внимание, что член экземпляра имени, который определен в классе Person, наследуется в классе Student.

  • В конструкторе класса Student мы вызываем конструктор базового класса.

  • В нашем классе Student мы добавляем 2 дополнительных члена экземпляра StudentID и 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();
   } 
}

Когда мы запустим вышеуказанную программу, мы получим следующий результат -

Joe

Внутренние классы

Внутренние классы определены в других классах. Вмещающий класс может использовать внутренний класс как обычно. С другой стороны, внутренний класс может получить доступ к членам своего окружающего класса, даже если они являются частными. Классам, отличным от включающего класса, не разрешен доступ к внутренним классам.

Ниже приведен пример внешнего и внутреннего классов. В следующем примере мы делаем следующие вещи -

  • Создание класса под названием Outer, который будет нашим внешним классом.
  • Определение строки с именем name в нашем внешнем классе.
  • Создание внутреннего или вложенного класса внутри нашего внешнего класса.
  • Обратите внимание, что во внутреннем классе мы можем получить доступ к члену экземпляра имени, определенному во внешнем классе.
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

Абстрактные классы

Абстрактные классы представляют общие концепции, поэтому они не могут быть созданы для создания подклассов. Их члены включают поля / свойства и абстрактные или конкретные методы. Абстрактные методы не имеют реализации и должны быть реализованы конкретными подклассами. Абстрактные классы должны быть объявлены с ключевым словом abstract. Абстрактные методы также должны быть объявлены с ключевым словом abstract.

В следующем примере обратите внимание, что класс 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