Trong Groovy, cũng như trong bất kỳ ngôn ngữ hướng đối tượng nào khác, có khái niệm về classes và objectes để thể hiện bản chất hướng đối tượng của ngôn ngữ lập trình. Groovy class 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 với nhau, data và các method của một class được sử dụng để biểu diễn một số đối tượng trong thế giới thực.

Hướng đối tượng trong groovy
Một class trong Groovy khai báo state (dữ liệu) và behavior của các đối tượng được class đó xác định. Do đó, Groovy class mô tả cả instance fields và method cho class đó.
Sau đây là ví dụ về một class trong Groovy. Tên của class là. Student có hai trường – StudentID vs StudentName. Trong hàm main, chúng ta đang tạo một đối tượng của class này và gán các giá trị cho StudentID và StudentName 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"
}
}
getter and setter
Trong bất kỳ ngôn ngữ lập trình nào, việc ẩn các thành viên phiên bản bằng private keyword luôn là một thói quen và thay vào đó cung cấp các phương thức getter và setter để đặt và nhận các giá trị của các biến tương ứng.
Ví dụ sau đây cho thấy điều này có thể được thực hiện như thế nào.
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ạy chương trình trên, chúng ta sẽ nhận được kết quả sau:
1
Joe
Trong class, cả StudentID vs StudentName đều được đánh dấu là private, nghĩa là chúng không thể được truy cập từ bên ngoài class.
Mỗi instance member có phương thức getter và setter riêng. Phương thức getter trả về giá trị của instance variable, ví dụ phương thức int getStudentID() và phương thức setter đặt giá trị của instance ID, ví dụ phương thức - void setStudentName(String pName)
Instance Methods
Thông thường, việc bao gồm nhiều method hơn bên trong class là điều bình thường, nhằm mục đích thực hiện một số loại chức năng cho class. Trong ví dụ về Student của chúng ta, hãy thêm các thành viên thể hiện của Marks1, Marks2 và Marks3 để biểu thị điểm của học sinh trong 3 môn học. Sau đó, tôi sẽ thêm một method để tính tổng điểm của học sinh.
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ạy chương trình trên, chúng ta sẽ nhận được kết quả sau:
60
Creating Multiple Objects
Người ta cũng có thể tạo nhiều đối tượng của một class. Sau đây là ví dụ về cách đạt được điều này. Ở đây ta đang tạo 3 objects (st, st1 và st2) và gọi các instance members vs instance methods 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ạy chương trình trên, chúng ta sẽ nhận được kết quả sau:
60
70
80
Inheritance
Kế thừa (Inheritance) có thể được định nghĩa là quá trình trong đó một class có được các thuộc tính (methods and fields) của class khác. Với việc sử dụng tính kế thừa, thông tin có thể được quản lý theo thứ tự phân cấp.
Class kế thừa các thuộc tính của Class khác được gọi là lớp con (lớp dẫn xuất, lớp con) và Class có các thuộc tính được kế thừa được gọi là superclass (lớp cơ sở, lớp cha).
Extends
Extends là từ khóa được sử dụng để kế thừa các thuộc tính của một class.
Tạo một class có tên Person. Lớp này có một instance member được gọi là name.
Tạo một class có tên là Student mở rộng từ class Person. Lưu ý rằng instance member được xác định trong Person sẽ được kế thừa trong class Student.
Trong hàm create của class Student, chúng ta đang gọi hàm tạo của class cơ sở.
Trong class Student, chúng tôi đang thêm 2 instance member là 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();
}
}
Kết quả sẽ là
Joe
Inner Classes
Các Inner Class được định nghĩa trong các class khác. Enclosing class có thể sử dụng Inner Class như bình thường. Mặt khác, một Inner Class có thể truy cập các thành viên của lớp kèm theo nó, ngay cả khi chúng ở chế độ private. Các class khác ngoài Enclosing class không được phép truy cập các Inner Class.
Tạo một Class có tên Outer, nó sẽ là outer class của chúng ta.
Khai báo một string có tên name trong outer class.
Tạo một Inner Class hoặc nested class bên trong outer class.
Lưu ý rằng trong Inner Class, chúng ta có thể truy cập name instance member được xác định trong outer class.
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 Classes
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 mà được tạo ra để phân lớp. 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 triển khai và phải được triển khai 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 bằng từ khóa trừu tượng.
Trong ví dụ sau, hãy lưu ý rằng lớp Person hiện được tạo thành một lớp trừu tượng và không thể khởi tạo được. 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 không có chi tiết triển khai. Trong lớp sinh viên, bắt buộc phải thêm chi tiết triển khai.
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
Interfaces
Một Interface xác định một contract mà một class cần phải tuân theo. Một interface chỉ xác định danh sách các phương thức cần được triển khai chứ không xác định việc triển khai các phương thức. Một Interface cần được khai báo bằng từ khóa Interface. Một Interface chỉ xác định method signatures. Các method của một interface luôn được public. Sẽ có lỗi khi sử dụng các method được protected hoặc private trong interface.
Tạo Interface có tên Marks và tạo interface method có tên DisplayMarks.
Trong định nghĩa lớp, chúng ta sử dụng từ khóa implements để triển khai interface.
Bởi vì tôi đang triển khai interface nên tôi phải cung cấp cách 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);
}
}
Ta nhận được kết quả:
10
null
Bài tiếp theo: Bài 14 - Hướng dẫn lập trình groovy: Generics - Traits - Annotations
Không có nhận xét nào: