Phương thức (methods) là các hàm, thủ tục, chương trình con (subroutines) trong một class. Phương thức có thể sử dụng như một hàm, hay thủ tục thông thường nhưng kèm theo tên class phía trước.
Phương thức gồm hai phần: phần định nghĩa trong class (declare) và phần triển khai bên ngoài class (implement).
Tiếp theo sẽ là một ví dụ đơn giản về khai báo và sử dụng method.
type
TBall = class
BanKinh: byte;
procedure Kick;
function TheTich: Single;
end;
procedure TBall.Kick;
begin
WriteLn('The ball had been kicked');
end;
function TheTich: Single;
begin
Result := 4/3 * 3.14 * BanKinh*BanKinh*BanKinh;
end;
Đoạn code trên khai báo một class TBall, với một trường BanKinh và hai phương thức:
Cách triển khai phương thức như tạo một thủ tục hay hàm đơn giản, nhưng thêm vào trước tên phương thức tên class và dấu chấm (.).
Trong mỗi class đều có hai phương thức mặc định đặc biệt là Create và Destroy (public).
Khi ta khai báo một class (thừa kế từ lớp TObject) như sau
type
TMyClass = class
private
FValue: byte;
end;
Thì thực sự class là
type
TMyClass = class
private
FValue: byte;
public
constructor Create;
destructor Destroy;
end;
Phương thức Create dùng để khởi tạo một đối tượng (object) từ một class. Như các ví dụ ở các bài trước.
var
MyObject: TMyClass;
begin
MyObject := TMyClass.Create;
MyObject.Destroy;
end.
Ngược lại, phương thức Destroy phá hủy đối tượng đã được khởi tạo bằng Create.
Hai phương thức đặc biệt này có thể override (ghi đè) hoặc overload (nạp chồng). Phổ biến nhất là nạp chồng phương thức Create với các tham số khác để khởi tạo giá trị ban đầu cho class.
type
THocSinh = class
var
FTenHS: string;
FKhoi: byte;
FLop: byte;
public
constructor Create(TenHS: string; Khoi, Lop: byte); overload;
end;
constructor THocSinh.Create(TenHS: string; Khoi, Lop: byte);
begin
FTenHS := TenHS;
FKhoi := Khoi;
FLop := Lop;
end;
Lợi ích của việc này là gì ? Nó cho phép viết mã khởi tạo class nhanh hơn. Thay vì viết
var
HS1: THocSinh;
begin
HS1 := THocSinh.Create;
HS1.FTen := 'Tong Hoang Vu';
HS1.FKhoi := 12;
HS1.FLop := 3;
...
end.
Thì ta có thể viết nhanh hơn nhờ sử dụng thẳng các tham số vào phương thức Create.
var
HS1: THocSinh;
begin
HS1 := THocSinh.Create('Tong Hoang Vu', 12, 3);
...
end.
Phương thức lớp (class method) được gọi là phương thức tĩnh của lớp trong các ngôn ngữ khác, là phương thức mà có thể sử dụng trực tiếp từ lớp, không cần tạo đối tượng (thực thể hóa một object từ class).
Cụ thể là class TFile trong unit System.IOUtils. Nó chứa rất nhiều phương thức lớp như TFile.RenameFile(FileName1, FileName2: string) mà ta có thể sử dụng trực tiếp mà không cần tạo một object.
begin
TFile.Rename('Word.doc', '1.txt');
end.
Để định nghĩa một class method ta làm như sau. Lấy ví dụ TFile như trên.
type
TFile = class
class procedure Rename(FileName1, FileName2: string);
end;
class procedure TFile.Rename(FileName1, FileName2: string);
begin
// Làm gì đó để đổi tên file
end;
begin
TFile.RenameFile('1.txt', '2.txt');
end.
Cấu trúc của class method không khác biệt gì nhiều với các method khác, chỉ cần thêm từ khóa class vào đầu khai báo là được.
Cách sử dụng của class method cũng đơn giản hơn rất nhiều do không cần tạo object trung gian.
type
TXe = class
FName: string;
procedure GioiThieu;
end;
procedure TXe.GioiThieu;
begin
WriteLn('Day la xe ', FName);
WriteLn('Day la xa ', Self.FName);
end;
Nhìn vào hai dòng lệnh trong phần triển khai phương thức TXe.GioiThieu. Hai dòng này không khác biệt gì nhau ngoại trừ từ khóa Self ở dòng thứ hai.
Từ khóa Self mang ý nghĩa chỉ đến lớp TXe, là đại diện cho class trong phần triển khai phương thức.
Chẳng hạn, Self trong các trường hợp sau mang ý nghĩa khác nhau
function TNumber.ToString;
begin
Self.Cong1; // Self mang ý nghĩa chỉ TNumber
end;
Phương thức ảo cho phép phương thức cùng tên trong lớp con (subclass) của nó được quyền override. Từ đó, một class có thể được mở rộng và phong phú hơn.
Phương thức ảo được xác định bằng cách thêm từ khóa virtual (ảo) vào cuối khai báo method.
type
TAnimal = class
procedure Eat; virtual;
end;
TDog = class(TAnimal)
procedure Eat; override;
end;
procedure TAnimal.Eat;
begin
WriteLn('Dong vat dang an');
end;
procedure TDog.Eat;
begin
WriteLn('Cho dang an');
end;
Như trên, method TAnimal.Eat là phương thức ảo. Nhờ đó, lớp con TDog có thể override phương thức Eat có sẵn, thực hiện nó theo cách khác.
Từ khóa dynamic mang ý nghĩa tương tự virtual. Dynamic được tối ưu hóa cho bộ nhớ ít hơn, trong khi virtual cho tốc độ nhanh hơn.
(Xem thêm ví dụ ở phần Ghi đè và nạp chồng)