Ảo vs Trừu tượng
Ảo và Trừu tượng 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ó một số khác biệt nhỏ về ý nghĩa của các ngôn ngữ khác nhau, cả từ khóa Ảo và Trừu tượng đều mang lại cảm giác triển khai một 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à Các lớp cơ sở trừu tượng (ABC), không thể được khởi tạo (một thể hiện của lớp đó không thể được tạo). 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ợ 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 thực hiện. Do đó, các lớp Trừu tượng đóng vai trò là 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 chỉnh của lớp cha và chức năng có thể được thêm vào để hoàn thành 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ể thực hiện các phương thức Trừu tượng (được kế thừa) này. Nếu lớp con thực hiện tất cả các phương thức Trừu tượng như vậy, thì đó là một lớp cụ thể. Nhưng nếu không, lớp con cũng trở thành 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à Tóm tắt, cô ấy 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 thực hiện 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 trừu tượng.
Ảo
Các phương thức / hàm ảo cung cấp khả năng ghi đè tùy chọn hành vi của nó bằng 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 rất quan trọng trong kịch bản sau đây. Giả sử một lớp được dẫn xuất bởi một lớp con, sau đó 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. Nhưng, hành vi gọi phương thức có thể mơ hồ nếu các phương thức lớp cơ sở bị ghi đè. Vì vậy, để giải quyết sự mơ hồ này, từ khóa ảo được sử dụng. Nếu phương thức được đánh dấu là Virtual, 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 ảo được sử dụng chính xác cho mục đích này. Trong C #, từ khóa ảo được sử dụng theo cách tương tự, nhưng ngoài ra, nên ghi đè từ khóa để sửa đổi tất cả các phương thức được 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 trên thực tế là Pure Virtual.
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 của việc triển khai không đầy đủ cho các thực thể liên quan, nhưng chúng có những điểm 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ó triển khai, trong khi các phương thức ảo có thể có 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 được kế thừa phải được triển khai, trong khi các phương thức ảo được kế thừa có thể hoặc không thể bị ghi đè.