Delphi đã cung cấp một tính năng khá thú vị, cho phép những hàm, thủ tục, phương thức khác nhau có thể có cùng tên.
Overloading (nạp chồng) cho phép các hàm, thủ tục, phương thức có thể có cùng tên nhưng bắt buộc phải khác tham số (khác các kiểu dữ liệu của tham số).
Overriding (ghi đè) chỉ sử dụng cho phương thức của subclass để ghi đè phương thức đã có trong lớp cơ sở. Override bắt buộc phương thức phải có cùng danh sách tham số, nếu khác thì dùng overload.
Ví dụ đơn giản nhất cho overloading là hàm tính tổng hai biến Sum. Hàm tính tổng có thể thực hiện cho hai số nguyên, hai số thực hoặc hai string (nối chuỗi).
function Sum(A, B: Integer): Integer;
begin
Result := A + B;
end;
function Sum(C, D: Double): Double; overload;
begin
Result := C + D;
end;
function Sum(S1, S2: string): string; overload;
begin
Result := S1 + S2;
end;
Như đã thấy, các tham số của ba hàm cùng tên Sum ở trên khác kiểu dữ liệu, nen hai hàm sau dùng từ khóa overload đặt ở cuối khai báo hàm.
Ba hàm này có cách sử dụng khác nhau, được chọn tùy vào đối số được gọi
begin
WriteLn(Sum(1, 2)); // 3
WriteLn(Sum(1.5, 1.0)); // 3.5
WriteLn(Sum('Nguyen ', 'Van A')); // Nguyen Van A
end.
Mẹo: Khi gõ tên một hàm có tên được overload, code insight (gợi ý mã) sẽ hiển thị cho ta danh sách những hàm cùng tên khác và các đối số. Ta có thể dùng phím mũi tên và Enter để lựa chọn phù hợp.
Lưu ý: Đừng chú ý quá nhiều vào phần này, hãy xem sơ qua để hiểu cách hoạt động. Phần class sẽ giải thích kĩ hơn.
Overload một hàm trong lớp cơ sở (base class): Thường sử dụng cho method Create để tạo nhanh đối tượng.
type
TNguoi = class
FName: string;
end;
THocSinh = class
FLop: string;
public
constructor Create(Lop: string); overload;
end;
constructor THocSinh.Create(Lop: string);
begin
FLop := Lop;
end;
Như trên, phương thức Create ở lớp cha là TNguoi (luôn tồn tại dù không được khai báo) được overload ở lớp con là THocSinh bằng cách thêm một tham số Lop.
Nhờ đó, ta có thể khởi tạo nhanh một đối tượng từ lớp. Thay vì viết
var
HS1: THocSinh;
begin
HS1.Create;
HS1.FLop := '12A2';
end.
thì có thể thay bằng
var
HS1: THocSinh;
begin
HS1.Create('12A2');
end.
Sẽ ngắn gọn và dễ dàng hơn.
Override phương thức
Một phương thức chỉ được override nếu nó được xác định là dynamic hoặc virtual (ảo).
type
TAnimal = class
procedure Eat; virtual;
end;
TDog = class(TDongVat)
procedure Eat; override;
end;
procedure TAnimal.Eat;
begin
WriteLn('Dong vat dang an');
end;
procedure TDog.Eat;
begin
WriteLn('Cho dang an');
end;
Phương thức Eat của lớp TDog đã ghi đè Eat của lớp cha là TDongVat, cho phép TDog.Eat thực hiện theo cách riêng của nó.
Lưu ý: Cả override và overload trong class chỉ được phép đặt từ khóa override (hoặc overload) trong phần khai báo (method declaration), phần triển khai phương thức (method implementation) không cần thiết thêm.