Groovy - Hướng đối tượng

Trong Groovy, cũng như bất kỳ ngôn ngữ hướng đối tượng nào khác, có khái niệm về các lớp và đối tượng để thể hiện bản chất hướng đối tượng của ngôn ngữ lập trình. Lớp Groovy là một tập hợp dữ liệu và các phương thức hoạt động trên dữ liệu đó. Cùng nhau, dữ liệu và phương thức của một lớp được sử dụng để biểu diễn một số đối tượng thế giới thực từ miền vấn đề.

Một lớp trong Groovy khai báo trạng thái (dữ liệu) và hành vi của các đối tượng được định nghĩa bởi lớp đó. Do đó, một lớp Groovy mô tả cả các trường cá thể và các phương thức cho lớp đó.

Sau đây là một ví dụ về một lớp học ở Groovy. Tên của lớp là Sinh viên có hai trường:StudentIDStudentName. Trong hàm main, chúng ta đang tạo một đối tượng của lớp này và gán giá trị choStudentIDStudentName của đối tượng.

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

Phương thức getter và setter

Trong bất kỳ ngôn ngữ lập trình nào, bạn nên ẩn các thành viên cá thể bằng từ khóa private và thay vào đó cung cấp các phương thức getter và setter để đặt và lấy các giá trị của các biến cá thể cho phù hợp. Ví dụ sau đây cho thấy cách này có thể được thực hiện.

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

Khi chúng ta chạy chương trình trên, chúng ta sẽ nhận được kết quả sau:

1 
Joe

Lưu ý những điểm chính sau đây về chương trình trên -

  • Trong lớp, studentID và studentName đều được đánh dấu là private, nghĩa là không thể truy cập chúng từ bên ngoài lớp.

  • Mỗi thành viên thể hiện có phương thức getter và setter riêng. Phương thức getter trả về giá trị của biến cá thể, ví dụ: phương thức int getStudentID () và phương thức setter đặt giá trị của ID cá thể, ví dụ phương thức - void setStudentName (String pName)

Phương pháp phiên bản

Thông thường, việc bao gồm nhiều phương thức hơn bên trong lớp thực sự thực hiện một số chức năng cho lớp. Trong ví dụ sinh viên của chúng tôi, hãy thêm các thành viên cá thể của Marks1, Marks2 và Marks3 để biểu thị điểm của sinh viên trong 3 môn học. Sau đó, chúng tôi sẽ thêm một phương thức thể hiện mới để tính tổng điểm của học sinh. Sau đây là mã sẽ trông như thế nào.

Trong ví dụ sau, phương thức Total là một phương thức Instance bổ sung có một số logic được tích hợp sẵn.

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

Khi chúng ta chạy chương trình trên, chúng ta sẽ nhận được kết quả sau:

60

Tạo nhiều đối tượng

Người ta cũng có thể tạo nhiều đối tượng của một lớp. Sau đây là ví dụ về cách có thể đạt được điều này. Ở đây, chúng ta đang tạo 3 đối tượng (st, st1 và st2) và gọi các thành viên thể hiện và phương thức thể hiện của chúng tương ứng.

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

Khi chúng ta chạy chương trình trên, chúng ta sẽ nhận được kết quả sau:

60 
70 
80

Di sản

Kế thừa có thể được định nghĩa là quá trình mà một lớp có được các thuộc tính (phương thức và trường) của lớp khác. Với việc sử dụng tính kế thừa, thông tin được quản lý theo một thứ tự phân cấp.

Lớp kế thừa các thuộc tính của khác được gọi là lớp con (lớp dẫn xuất, lớp con) và lớp có các thuộc tính được kế thừa được gọi là lớp cha (lớp cơ sở, lớp cha).

Mở rộng

extendslà từ khóa dùng để kế thừa các thuộc tính của một lớp. Dưới đây là cú pháp của từ khóa kéo dài. Trong ví dụ sau, chúng tôi đang làm những việc sau:

  • Tạo một lớp có tên là Người. Lớp này có một thành viên thể hiện được gọi là tên.

  • Tạo một lớp được gọi là Sinh viên mở rộng từ lớp Người. Lưu ý rằng thành viên thể hiện tên được định nghĩa trong lớp Người sẽ được kế thừa trong lớp Sinh viên.

  • Trong hàm tạo lớp Sinh viên, chúng ta đang gọi hàm tạo lớp cơ sở.

  • Trong lớp Sinh viên của chúng tôi, chúng tôi đang thêm 2 thành viên phiên bản bổ sung của StudentID và 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();
   } 
}

Khi chúng ta chạy chương trình trên, chúng ta sẽ nhận được kết quả sau:

Joe

Lớp bên trong

Các lớp bên trong được định nghĩa bên trong các lớp khác. Lớp bao quanh có thể sử dụng lớp bên trong như bình thường. Mặt khác, một lớp bên trong có thể truy cập các thành viên của lớp bao quanh nó, ngay cả khi chúng là riêng tư. Các lớp khác với lớp bao quanh không được phép truy cập các lớp bên trong.

Sau đây là một ví dụ về lớp Bên ngoài và Bên trong. Trong ví dụ sau, chúng tôi đang làm những việc sau:

  • Tạo một lớp có tên là Outer sẽ là lớp bên ngoài của chúng ta.
  • Định nghĩa một chuỗi được gọi là tên trong lớp Outer của chúng tôi.
  • Tạo một lớp Bên trong hoặc lớp lồng nhau bên trong lớp Bên ngoài của chúng ta.
  • Lưu ý rằng trong lớp bên trong, chúng ta có thể truy cập thành viên thể hiện tên được định nghĩa trong lớp Bên ngoài.
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); 
      } 
   } 
	
}

Khi chúng ta chạy chương trình trên, chúng ta sẽ nhận được kết quả sau:

Joe

Các lớp trừu tượng

Các lớp trừu tượng đại diện cho các khái niệm chung, do đó, chúng không thể được khởi tạo, được tạo ra để trở thành lớp con. Các thành viên của chúng bao gồm các trường / thuộc tính và các phương thức trừu tượng hoặc cụ thể. Các phương thức trừu tượng không có thực thi, và phải được thực hiện bởi các lớp con cụ thể. Các lớp trừu tượng phải được khai báo bằng từ khóa trừu tượng. Các phương thức trừu tượng cũng phải được khai báo với từ khóa trừu tượng.

Trong ví dụ sau, lưu ý rằng lớp Person bây giờ được tạo thành một lớp trừu tượng và không thể được khởi tạo. Cũng lưu ý rằng có một phương thức trừu tượng được gọi là DisplayMarks trong lớp trừu tượng mà không có chi tiết triển khai. Trong lớp sinh viên, bắt buộc phải thêm các chi tiết thực hiện.

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

Khi chúng ta chạy chương trình trên, chúng ta sẽ nhận được kết quả sau:

Joe 
10 
null

Giao diện

Một giao diện xác định một hợp đồng mà một lớp cần tuân theo. Một giao diện chỉ xác định danh sách các phương thức cần được triển khai, nhưng không xác định việc triển khai các phương thức. Một giao diện cần được khai báo bằng từ khóa interface. Một giao diện chỉ xác định các chữ ký của phương thức. Các phương thức của một giao diện luônpublic. Đó là một lỗi khi sử dụng các phương thức được bảo vệ hoặc riêng tư trong các giao diện.

Sau đây là một ví dụ về giao diện trong Groovy. Trong ví dụ sau, chúng tôi đang làm những việc sau:

  • Tạo một giao diện được gọi là Marks và tạo một phương thức giao diện được gọi là DisplayMarks.

  • Trong định nghĩa lớp, chúng ta đang sử dụng từ khóa triển khai để triển khai giao diện.

  • Bởi vì chúng tôi đang triển khai giao diện, chúng tôi phải cung cấp triển khai cho phương thức 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);
   }
}

Khi chúng ta chạy chương trình trên, chúng ta sẽ nhận được kết quả sau:

10
null