Trừu tượng (abstraction) là một khái niệm quan trọng trong lập trình hướng đối tượng.
Nó cho biết những phương thức mà chỉ có lớp con của nó mới thực hiện được trong khi bản thân nó không thể thực hiện.
Ví dụ, ta có một lớp THinhHoc (hình học), có phương thức SoCanh: Integer.
Dĩ nhiên, phương thức SoCanh không thể tính được do ta chưa biết đó là hình gì.
Nhưng các lớp con của lớp THinhHoc như TTamGiac, THinhVuong, ... thì có thể tính được số cạnh (TTamGiac có số cạnh là 3, THinhVuong có số cạnh là 4, ...). Ta gọi phương thức SoCanh là một phương thức trừu tượng.
type
THinhHoc = class
function SoCanh: Integer; virtual; abstract;
end;
TTamGiac = class(THinhHoc)
function SoCanh: Integer; override;
end;
...
function TTamGiac.SoCanh: Integer;
begin
Result:= 3;
end;
Như đã đề cập ở ví dụ phần sơ lược, ta khai báo hai class, lớp cha THinhHoc và lớp con TTamGiac. Dễ thấy không thể tính được SoCanh của lớp cha THinhHoc (do không biết hình gì) nhưng ở lớp con TTamGiac thì có thể tính được SoCanh (bằng 3). Như vậy gọi là trừu tượng (abstraction).
Ở lớp cha, phương thức trừu tượng là SoCanh được gán thêm hai từ khóa phía cuối là virtual và abstract.
Abstract đánh dấu phương thức này là trừu tượng. Virtual đánh dấu nó sẽ không được triển khai ở lớp cha mà chỉ thực hiện ở lớp con (là lớp TTamGiac).
Lớp con ghi đè (override) phương thức SoCanh của lớp cha (luôn luôn). Nó sẽ thực hiện theo một cách riêng của nó.
Bên cạnh từ khóa virtual còn có từ khóa dynamic với nghĩa tương đương. Nhưng khác ở chỗ virtual tối ưu hóa cho tốc độ, dynamic tối ưu cho bộ nhớ ít hơn.
Lưu ý: Hoặc virtual, hoặc dynamic phải luôn đi kèm với abstract.
Trừu tượng của lớp cha là nền tảng cho lớp con, nó bắt buộc lớp con phải thực hiện đúng theo những gì lớp cha yêu cầu. Ví dụ như xe đạp phải có thuộc tính SoBanhXe, thuộc tính này xác định XeDap là một chiếc Xe.