Ảo và Trừu tượng
Virtual và Abstract là hai từ khóa được sử dụng trong hầu hết các ngôn ngữ lập trình Hướng đối tượng (OO) như Java và C. Mặc dù có sự khác biệt nhỏ về ý nghĩa của nó trong các ngôn ngữ khác nhau, cả từ khóa Ảo và Từ khóa trừu tượng đều mang lại cảm giác triển khai từng phần cho các thực thể mà nó gắn vào.
Trừu tượng
Thông thường, các lớp Trừu tượng, còn được gọi là Lớp Cơ sở Trừu tượng (ABC), không thể được khởi tạo (không thể tạo một thể hiện của lớp đó). Vì vậy, các lớp trừu tượng chỉ có ý nghĩa nếu ngôn ngữ lập trình hỗ trợ tính kế thừa (khả năng tạo các lớp con từ việc mở rộng một lớp). Các lớp trừu tượng thường đại diện cho một khái niệm hoặc thực thể trừu tượng với một phần hoặc không có triển khai. Do đó, các lớp trừu tượng hoạt động như các lớp cha mà từ đó các lớp con được dẫn xuất, do đó lớp con sẽ chia sẻ các tính năng chưa hoàn thiện của lớp cha và chức năng có thể được thêm vào để hoàn thiện chúng. Các lớp trừu tượng có thể chứa các phương thức Trừu tượng. Các lớp con mở rộng một lớp trừu tượng có thể triển khai các phương thức Trừu tượng (kế thừa) này. Nếu lớp con triển khai tất cả các phương thức Trừu tượng như vậy, nó là một lớp cụ thể. Nhưng nếu không, lớp con cũng trở thành một lớp Trừu tượng. Tất cả điều này có nghĩa là, khi lập trình viên chỉ định một lớp là một lớp Trừu tượng, cô ấy đang nói rằng lớp đó sẽ không hoàn chỉnh và nó sẽ có các phần tử cần được hoàn thành bởi các lớp con kế thừa. Đây là một cách hay để tạo hợp đồng giữa hai lập trình viên, giúp đơn giản hóa các nhiệm vụ trong phát triển phần mềm. Lập trình viên, người viết mã để kế thừa, cần tuân theo chính xác các định nghĩa phương thức (nhưng tất nhiên có thể có cách triển khai của riêng cô ấy). Trong Java và C, các lớp và phương thức trừu tượng được khai báo bằng từ khóa Abstract.
Ảo
Các phương thức / hàm ảo cung cấp khả năng tùy chọn ghi đè hành vi của nó bởi một lớp kế thừa (sử dụng một hàm có cùng chữ ký). Khái niệm về chức năng Ảo là quan trọng trong tình huống sau. Giả sử một lớp được dẫn xuất bởi một lớp con, thì bất cứ khi nào một đối tượng của lớp dẫn xuất được sử dụng, nó có thể tham chiếu đến một đối tượng của lớp cơ sở hoặc lớp dẫn xuất. Tuy nhiên, hành vi gọi phương thức có thể không rõ ràng nếu các phương thức của lớp cơ sở bị ghi đè. Vì vậy, để giải quyết sự mơ hồ này, từ khóa Virtual được sử dụng. Nếu phương thức được đánh dấu là Ảo, thì hàm của lớp dẫn xuất được gọi (nếu có) hoặc nếu không thì hàm của lớp cơ sở được gọi. Ví dụ, trong C ++, từ khóa Virtual được sử dụng chính xác cho mục đích này. Trong C, từ khóa Virtual được sử dụng theo cách tương tự, nhưng ngoài ra, từ khóa ghi đè nên được sử dụng để sửa đổi tất cả các phương thức bị ghi đè. Nhưng trong Java, không có từ khóa Ảo rõ ràng. Tất cả các phương thức không tĩnh được coi là Ảo. Các hàm ảo không có phần thân được gọi là các hàm Pure Virtual. Trong Java và C, các phương thức Trừu tượng thực chất là Ảo thuần túy.
Sự khác biệt giữa Ảo và Trừu tượng
Mặc dù Trừu tượng và Ảo là hai từ khóa / khái niệm cung cấp ý nghĩa về việc triển khai không đầy đủ cho các thực thể liên quan của nó, nhưng chúng có sự khác biệt. Các phương thức trừu tượng (phải được định nghĩa bên trong các lớp Trừu tượng) hoàn toàn không có một triển khai, trong khi các phương thức Ảo có thể có một triển khai. Nếu các phương thức Trừu tượng được mở rộng bởi một lớp cụ thể, tất cả các phương thức Trừu tượng kế thừa phải được triển khai, trong khi các phương thức Ảo được kế thừa có thể bị ghi đè hoặc không.